如何调用嵌套的异步方法

瓦希德·贾法里(Vahid Jafari)

我想知道调用嵌套异步方法的最佳方法是什么,如果我希望这两种方法都是异步的。
第一:调用者方法必须返回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

原因是代码执行的方式如下:

  1. 它将UpdateAsync在调用线程上执行导致等待的所有部分,这意味着foreach-loop将在调用线程上执行
  2. 它将执行SaveChangesAsync()直到调用返回为止的调用,仍然在调用线程上
  3. SaveChangesAsync将调用Context.SaveChangesAsync()直到返回,仍然在调用线程上

简而言之,这些方法的所有工作都已经在调用线程上完成,剩下的只是的异步性Context.SaveChangesAsync如果您async/await完全放弃并且只是简单地返回将异步性包装起来的任务,那么您就没有牺牲任何功能,而是消除了编译器使用async/await方法为您生成的所有复杂性

一般规则是这样的:

除非您需要在async方法返回做一些事情,否则不要使用async/await

由于这两种方法都在调用async方法之后立即结束,因此最好还是返回所涉及的任务,而不要使用async/await

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章