给出以下类别:
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 值。为什么这样?
答案 0 :(得分:0)
此代码返回一个Task
async Task AddAccountAsync(AccountModel model)
因此,您需要Wait
才能完成Task
。通常是这样的:
var result = AddAccountAsync(model);
result.Wait()
混合Wait
和await
有点危险!您通常可能会陷入僵局。
更好的选择是在await
Task
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)
您会发现问题中的注释在询问:您究竟如何调用这些方法?
调用这些方法的方式将提供线索,说明为什么这些值不符合您的期望。
您可以浏览Stephen Cleary的有关异步/等待的博客: http://blog.stephencleary.com/2012/02/async-and-await.html
“异步构成”部分与您的查询相关。