异步方法混淆

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

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标记为完成的开销。