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

时间:2018-07-31 21:38:21

标签: c# postgresql entity-framework-core npgsql

给出以下类别:

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 值。为什么这样?

1 个答案:

答案 0 :(得分:0)

此代码返回一个Task

async Task AddAccountAsync(AccountModel model)

因此,您需要Wait才能完成Task。通常是这样的:

var result = AddAccountAsync(model);
result.Wait()

混合Waitawait有点危险!您通常可能会陷入僵局。 更好的选择是在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

“异步构成”部分与您的查询相关。