8

我读过“BackgroundWorker”旨在被Ansyc/Await 取代。

因为我喜欢 Async/Await 的简洁外观,所以我开始将我的一些 BackgroundWorkers 转换为 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 包。

4

1 回答 1

6

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

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

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

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

于 2012-12-18T21:52:14.433 回答