异步方法混淆

时间:2016-03-11 13:38:51

标签: c# entity-framework asynchronous async-await

我试图绕过异步方法,我想知道以下两种方法之间的区别。

public Task Add(Tenant tenant)
{
    DbContext.Tenants.Add(tenant);
    return DbContext.SaveChangesAsync();
}

public async Task Add(Tenant tenant)
{
    DbContext.Tenants.Add(tenant);
    await DbContext.SaveChangesAsync();
}

2 个答案:

答案 0 :(得分:2)

首先是同步方法,它返回Task 第二个是异步方法,它等待方法结束时的另一个异步操作(尾调用)。

罗斯林有一个proposed optimization,如有可能,会将第二个转换为第一个。

答案 1 :(得分:1)

您的第二个版本引入了轻微的开销。编译器必须发出大量样板才能有效地允许当前方法恢复。

在这两种情况下,您的方法返回的是Task,这将在SaveChangesAsync异步完成所有请求的工作后完成。但在第一种情况下,您返回的内容是Task返回的确切SaveChangesAsync

而在第二种情况下,您返回的是新的Task对象。然后,正如我所说的那样,只要Task SaveChangesAsync标记为完成,就允许您的方法将此新Task标记为完整的开销。< / p>