我试图绕过异步方法,我想知道以下两种方法之间的区别。
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();
}
答案 0 :(得分:2)
首先是同步方法,它返回Task
第二个是异步方法,它等待方法结束时的另一个异步操作(尾调用)。
罗斯林有一个proposed optimization,如有可能,会将第二个转换为第一个。
答案 1 :(得分:1)
您的第二个版本引入了轻微的开销。编译器必须发出大量样板才能有效地允许当前方法恢复。
在这两种情况下,您的方法返回的是Task
,这将在SaveChangesAsync
异步完成所有请求的工作后完成。但在第一种情况下,您返回的内容是Task
返回的确切SaveChangesAsync
。
而在第二种情况下,您返回的是新的Task
对象。然后,正如我所说的那样,只要Task
将 SaveChangesAsync
标记为完成,就允许您的方法将此新Task
标记为完整的开销。< / p>