C# 异步方法混淆

C# 异步方法混淆,c#,entity-framework,asynchronous,async-await,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.SaveChangesA

我试图对异步方法进行思考,我想知道以下两种方法之间的区别是什么

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();
}
第一个是同步方法,它返回
任务

第二个是异步方法,它在方法末尾等待另一个异步操作(尾部调用)


Roslyn有一个版本,如果可能,它会将第二个版本转换为第一个版本。

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

在这两种情况下,方法返回的是一个
任务
,一旦
savechangesync
异步完成了所有请求的工作,该任务就会完成。但是在第一种情况下,您返回的是
任务
,它本身就是
savechangesync
返回的


而在第二种情况下,返回的是一个新的
Task
对象。然后,正如我所说,当
SaveChangesAsync
将它的
任务标记为完成时,允许您的方法将这个新的
任务标记为完成的开销。

啊,这很有意义,谢谢您的清楚解释!实际上,两者都返回
任务
,并且都可以awaited@enkryptor:是的,没错。但第一个并没有等待,编译器不会生成任何
async
状态机代码。这只是同步方法。