【问题标题】:Does an await make the rest of the method asynchronous?await 是否使其余方法异步?
【发布时间】:2012-12-06 04:38:09
【问题描述】:

我读过 Ansyc/Await 的“BackgroundWorker”是designed to be replaced

因为我喜欢 Async/Await 的简洁外观,所以我开始将我的一些 BackgroundWorker 转换为 Async/Await 调用。

这是我拥有的代码示例(从 UI 调用):

public async void RunFromTheUI()
{
   await OtherAction();
}

public async void OtherAction()
{
   var results = await services.SomeRemoteAction();

   foreach (var result in results)
   {
      result.SemiIntenseCalculation(); 
      Several();
      Other();
      NonAsync();
      Calls();  
   }

   SomeFileIO();
}

当我调用 RunFromTheUI 时,它几乎会立即返回(根据 Async 和 Await 设计)。

但是当它在services.SomeRemoteAction() 完成后恢复时,它有一个foreach 循环和另一个要运行的方法调用。

我的问题是:如果该循环是性能猪,它会冻结 UI 吗?(在我将它全部放在后台工作线程中之前,它不会减慢 UI 的速度)。

注意:我的目标是 .Net 4.0 并使用 Async Nuget 包。

【问题讨论】:

  • async/await 和 BackgroundWorker 解决了两个不同的问题。 BG worker 更精确地被 Tasks 取代。异步仅在工作主体代码基本上空闲时替换这些,当您需要进行繁重的工作时,BGW/Tasks 仍然有用。我看起来您正在等待问题中的服务结果,仅供参考。
  • 1.你的代码不会编译,你不能 await async void 方法。 2.你应该避免使用async void方法,它们不能是awaited并且使异常处理更加困难。

标签: c# .net async-await


【解决方案1】:

我的问题是:如果该循环是性能问题,它会冻结 UI 吗?

是的,它会的。远程操作完成后,其余的异步方法仍将在 UI 线程上执行。如果您不希望这种情况发生,那么选项是:

  • 使用ConfigureAwait(continueOnCapturedContext: false) 以便继续不会在 UI 线程上执行
  • 使用Task.Run 在不同的线程中执行整个方法。 (您仍然可以将其设为异步方法,以避免在不需要时阻塞线程。)

基本上,如果您有大量同步、阻塞调用或 CPU 密集型工作负载,您希望避免在 UI 线程上发生这种情况,这与 async/await 所做的相反默认是你。

【讨论】:

猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多