[英]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.