[英]Return (or not) id in the async method
给定以下类别:
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;
}
运行(等待)后的-9223372036854775808
是-9223372036854775808
。
但是如果我改用这个:
async Task<long> AddAccountAsync(AccountModel model)
{
Account entity = CreateFromModel(model);
DbContext.Add(entity);
await DbContext.SaveChangesAsync();
return entity.Id;
}
它返回正确的值。 为什么这样?
此代码返回一个Task
async Task AddAccountAsync(AccountModel model)
因此,您需要Wait
Task
完成。 通常是这样的:
var result = AddAccountAsync(model);
result.Wait()
混合Wait
await
有点危险! 您通常可能会陷入僵局。 更好的选择是在Task
上使用await
await result
调用结束后,我希望您的model
对象具有正确的值。
在调用多个async
方法并最终必须等待所有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)
您会看到问题中的注释在询问: 您到底如何调用这些方法?
调用这些方法的方式将提供线索,说明为什么这些值不符合您的期望。
您可以浏览Stephen Cleary的有关异步/等待的博客: http : //blog.stephencleary.com/2012/02/async-and-await.html
异步组合部分将与您的查询相关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.