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
状态机代码。这只是同步方法。