ConfigureAwait(false)和省略等待之间的区别?

时间:2014-08-03 05:48:01

标签: c# async-await

您有以下方法:

async Task DoWorkAsync();

以下两次调用之间的功能是否存在差异:

1. DoWorkAsync();
2. await DoWorkAsync().ConfigureAwait(false);

我唯一看到的是Visual Studio在使用第一个时发出警告,通知您方法执行将继续,而不会等待结果。

2 个答案:

答案 0 :(得分:9)

  

以下两次调用之间的功能是否存在差异:

     
      
  1. DoWorkAsync();
  2.   
  3. 等待DoWorkAsync()。ConfigureAwait(false);
  4.   

是;他们完全不同。第一个启动异步方法,然后立即继续当前方法。第二个(异步)等待异步方法完成。

有两个主要的语义差异:

  1. 执行此行后的代码。如果您await DoWorkAsync,则在DoWorkAsync完成之后,以下代码才会执行​​。如果您只是在没有等待的情况下调用DoWorkAsync,那么只要DoWorkAsync产生,就会执行以下代码。
  2. 如何处理异常。如果您await DoWorkAsync,那么来自DoWorkAsync的任何例外情况都会自然传播。如果你只是在没有等待它的情况下调用DoWorkAsync,那么任何异常都将被静默捕获并放在返回的任务上(被忽略,因此编译器警告)。

答案 1 :(得分:7)

ConfigureAwait(false)表示"不捕获同步上下文"。这意味着你仍然要等待结果,但是当它继续时,它不会试图将你回到UI线程上。

  • 如果您正在编写供其他人使用的库,请始终使用ConfigureAwait(false),否则可能会触发死锁。

  • 如果您正在编写受UI限制的应用程序(例如WPF,Silverlight,Windows 8),那么您不应该使用ConfigureAwait(false),因为您将继续使用错误的线程。

  • 如果您正在编写一个对上下文敏感的应用程序(例如ASP.NET MVC控制器),那么您不应该使用ConfigureAwait(false),因为您将继续使用错误的线程。

    < / LI>

参考:http://www.infoq.com/articles/Async-API-Design