【问题标题】:Return (or not) id in the async method在异步方法中返回(或不返回)id
【发布时间】:2019-01-08 09:16:50
【问题描述】:

给定以下类:

class Account
{
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
     public long Id {get; set;}
     ...
}

class AccountModel
{
    public long Id {get; set;}
    ...
}

如果我调用了这个方法:

async Task AddAccountAsync(AccountModel model)
{
    Account entity = CreateFromModel(model);
    DbContext.Add(entity);
    await DbContext.SaveChangesAsync();
    model.Id = entity.Id;
}

运行后的model.Id(带有等待)是-9223372036854775808

但如果我改用这个:

async Task<long> AddAccountAsync(AccountModel model)
{
    Account entity = CreateFromModel(model);
    DbContext.Add(entity);
    await DbContext.SaveChangesAsync();
    return entity.Id;
}

它返回 right 值。为什么会这样?

【问题讨论】:

  • 所以如果你这样做:var model = new AccountModel(); await AddAccountAsync(model); Console.WriteLine(model.Id); 你会得到id == -9223372036854775808?
  • 是的,我有 id == -9223372036854775808
  • 我想我的问题是,你怎么称呼AddAccountAsync?调用代码看起来如何?
  • @CodingYoshi 不正确:返回基本的Task 是完全正确的,你把它与async void 签名混淆了,如果可能的话确实应该避免

标签: c# postgresql entity-framework-core npgsql


【解决方案1】:

此代码返回Task

async Task AddAccountAsync(AccountModel model)

因此,您需要 Wait 才能完成 Task。通常是这样的:

var result = AddAccountAsync(model);
result.Wait()

混合Waitawait 有点危险!您通常会以死锁告终。 更好的选择是在Task 上使用await

await result

通话结束后,我希望您的 model 对象具有正确的值。

上述技术在您调用多个async 方法并最终必须等待所有方法完成的情况下很有用。

例如。

var result1Task = Method1Async();
var result2Task = Method2Async();
var result3Task = Method3Async();

...
--finally
await Task.WhenAll(result1Task, result2Task, result3Task);

您的第二种方法本身返回一个实际值

async Task<long> AddAccountAsync(AccountModel model)

您通常会await 上述方法调用并取回结果

var id = await AddAccountAsync(model)

您会看到问题中的 cmets 在询问:您究竟是如何调用这些方法的?

您调用这些方法的方式将提供一个线索,说明为什么这些值不符合您的预期。

您可以浏览 Stephen Cleary 的关于 async/await 的博客: http://blog.stephencleary.com/2012/02/async-and-await.html

异步组合部分将与您的查询相关。

【讨论】:

    猜你喜欢
    • 2014-10-22
    • 1970-01-01
    • 2013-05-03
    • 2012-12-20
    • 2018-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多