我想知道调用嵌套异步方法的最佳方法是什么,如果我希望这两种方法都是异步的。
第一:调用者方法必须返回Task
public async Task SaveChangesAsync()
{
await Context.SaveChangesAsync();
}
public Task UpdateAsync(List<TEntity> entities)
{
foreach (TEntity entity in entities)
{
BeforeUpdate(entity);
Context.Entry(entity).State = EntityState.Modified;
}
return SaveChangesAsync();
}
第二:调用者方法必须具有异步await
调用方法
public async Task SaveChangesAsync()
{
await Context.SaveChangesAsync();
}
public async Task UpdateAsync(List<TEntity> entities)
{
foreach (TEntity entity in entities)
{
BeforeUpdate(entity);
Context.Entry(entity).State = EntityState.Modified;
}
await SaveChangesAsync();
}
async/await
除非您未显示这些方法中的某些部分,否则不应使用此代码。
换句话说,这就是应该编写这些方法的方式:
public Task SaveChangesAsync()
{
return Context.SaveChangesAsync();
}
public Task UpdateAsync(List<TEntity> entities)
{
foreach (TEntity entity in entities)
{
BeforeUpdate(entity);
Context.Entry(entity).State = EntityState.Modified;
}
return SaveChangesAsync();
}
这基本上是您没有显示的选项3,根本没有任何痕迹async/await
。
原因是代码执行的方式如下:
UpdateAsync
在调用线程上执行导致等待的所有部分,这意味着foreach
-loop将在调用线程上执行SaveChangesAsync()
直到调用返回为止的调用,仍然在调用线程上SaveChangesAsync
将调用Context.SaveChangesAsync()
直到返回,仍然在调用线程上简而言之,这些方法的所有工作都已经在调用线程上完成,剩下的只是的异步性Context.SaveChangesAsync
。如果您async/await
完全放弃并且只是简单地返回将异步性包装起来的任务,那么您就没有牺牲任何功能,而是消除了编译器使用async/await
方法为您生成的所有复杂性。
一般规则是这样的:
除非您需要在async方法返回后做一些事情,否则不要使用
async/await
由于这两种方法都在调用async方法之后立即结束,因此最好还是返回所涉及的任务,而不要使用async/await
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句