【问题标题】:Async/await statemachine overhead [duplicate]异步/等待状态机开销 [重复]
【发布时间】:2017-05-22 13:22:38
【问题描述】:

我们都知道 Async Await 之所以成为可能是因为状态机已经到位,这让我想到了一个关于以下用例的问题:

Public async Task<string>   GetTotal(string p1)
{
    Return await GetTotal(p1,””);
}
Public async Task<string>   GetTotal(string p1, string p2)
{
  Return await GetTotal(p1,””,””);
}

Public async Task<string>   GetTotal(string p1, string p2, string p3)
{
  Return await GetTotal(p1,””,””, “”);
}

Public async Task<string>   GetTotal(string p1, string p2, string p3,string 
p4)
{
 //do some actual async calling
  Return result;
}

如果图中没有async/await,上面的代码是绝对正常的,但是对于async/await,我们是否应该避免上面列出的编码模式,基本上,如果我们没有状态机,我们应该尽量避免去?

 Public async Task<string>   GetTotal(string p1)
{
  //do some actual async calling
  Return result;
}
Public async Task<string>   GetTotal(string p1, string p2)
{
  //do some actual async calling
  Return result;
}
Public async Task<string>   GetTotal(string p1, string p2, string p3)
{
  //do some actual async calling
  Return result;
} 
Public async Task<string>   GetTotal(string p1, string p2, string p3,string 
p4)
{
 //do some actual async calling
 Return result;
}

【问题讨论】:

  • 如果您实际上不需要它,请不要使用await。一个没有await 的函数甚至不应该有async 应用到它。
  • FWIW,我不认为这个问题和链接的问题是完全相同的,并且有 很多 可以说特别是关于开销 i> 这在另一个问题中并不真正相关(或不存在)。
  • 我考虑过重新开放,但我们已经有了stackoverflow.com/q/37861864

标签: c# code-reuse


【解决方案1】:

如果你改变了

public async Task<string> GetTotal(string p1)
{
    Return await GetTotal(p1,””);
}

public Task<string> GetTotal(string p1)
{
    return GetTotal(p1,””);
}

(通过删除不执行异步工作的函数中的asyncawait)您将通过传递最里面的Task 对象来避免不必要的状态机。应该这样做以避免不必要的任务分配(和状态机)。

即使使用新的 ValueTask 类,有额外的 async 函数来包装内部函数,如果在高吞吐量代码路径中完成,也会有额外的内存分配/垃圾收集成本。

【讨论】:

  • 阅读他发布的底部代码。这就是他提到的......
  • @FrankerZ - 不,OP 似乎决定在底部示例中的所有四种方法中复制他们的代码。没有调用显示更多参数的方法。
【解决方案2】:

具有async 修饰符的方法会产生开销。在可能的情况下,如果可以避免,请省去麻烦并返回任务。

这是完全有效的,并且是推荐的方法。删除 async 关键字,并从其他异步方法返回任务。状态机只会生成一次(在 GetTotal 函数中):

public Task<string> GetTotal(string p1)
{
  //do some actual async calling
  return result;
}

如需进一步阅读,您可以阅读有关 async/await 开销 here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2019-06-29
    • 2018-06-25
    • 2018-09-22
    • 2021-03-28
    • 2018-03-22
    • 2016-01-18
    相关资源
    最近更新 更多