簡體   English   中英

在異步方法中返回(或不返回)id

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM