异步方法混淆
我试图绕过异步方法,我想知道以下两种方法之间的区别。
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(); }
第一个是同步方法,它返回Task
。
第二个是异步方法,它等待方法结束时的另一个异步操作(尾调用)。
Roslyn有一个建议的优化 ,如果可能的话,它会将第二个转换为第一个。
您的第二个变体引入了轻微的开销。 编译器必须发出大量样板才能有效地允许当前方法恢复。
在这两种情况下,您的方法返回的是一个Task
,一旦SaveChangesAsync
异步完成所有请求的工作,将完成该Task
。 但在第一种情况下,您返回的是SaveChangesAsync
返回的确切Task
。
而在第二种情况下,您返回的是一个新的Task
对象。 然后,正如我所说,只要SaveChangesAsync
其 Task
标记为完成,就允许您的方法将此新Task
标记为完成的开销。