繁体   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