ConfigureAwait(false)与省略await的区别

本文关键字:await 区别 false ConfigureAwait | 更新日期: 2023-09-27 18:16:12

您有以下方法:

async Task DoWorkAsync();

以下两种调用在功能上有区别吗?

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

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

ConfigureAwait(false)与省略await的区别

以下两种调用在功能上有区别吗?

  1. DoWorkAsync ();
  2. 等待DoWorkAsync () .ConfigureAwait(假);

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

有两个主要的语义差异:

  1. 当这行后面的代码执行时。如果您选择await DoWorkAsync,那么以下代码将在DoWorkAsync完成之前不会执行。如果您只是调用DoWorkAsync而不等待它,那么以下代码将在DoWorkAsync生成时立即执行。
  2. 如何处理异常。如果您使用await DoWorkAsync,那么来自DoWorkAsync的任何异常都会自然传播。如果您只是调用DoWorkAsync而不等待它,那么任何异常都将被静默捕获并放置在返回的任务上(它被忽略,因此编译器会发出警告)。

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

  • 如果你正在编写一个供其他人使用的库,总是使用ConfigureAwait(false),否则你可能会触发死锁。

  • 如果你正在编写一个ui绑定的应用程序(例如WPF, Silverlight, Windows 8),那么你不应该使用ConfigureAwait(false),因为你会继续在错误的线程上。

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

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