您有以下方法:
async Task DoWorkAsync();
以下两次调用之间的功能是否存在差异:
1. DoWorkAsync();
2. await DoWorkAsync().ConfigureAwait(false);
我唯一看到的是Visual Studio在使用第一个时发出警告,通知您方法执行将继续,而不会等待结果。
答案 0 :(得分:9)
以下两次调用之间的功能是否存在差异:
- DoWorkAsync();
- 等待DoWorkAsync()。ConfigureAwait(false);
醇>
是;他们完全不同。第一个启动异步方法,然后立即继续当前方法。第二个(异步)等待异步方法完成。
有两个主要的语义差异:
await DoWorkAsync
,则在DoWorkAsync
完成之后,以下代码才会执行。如果您只是在没有等待的情况下调用DoWorkAsync
,那么只要DoWorkAsync
产生,就会执行以下代码。await DoWorkAsync
,那么来自DoWorkAsync
的任何例外情况都会自然传播。如果你只是在没有等待它的情况下调用DoWorkAsync
,那么任何异常都将被静默捕获并放在返回的任务上(被忽略,因此编译器警告)。答案 1 :(得分:7)
ConfigureAwait(false)表示"不捕获同步上下文"。这意味着你仍然要等待结果,但是当它继续时,它不会试图将你回到UI线程上。
如果您正在编写供其他人使用的库,请始终使用ConfigureAwait(false),否则可能会触发死锁。
如果您正在编写受UI限制的应用程序(例如WPF,Silverlight,Windows 8),那么您不应该使用ConfigureAwait(false),因为您将继续使用错误的线程。
如果您正在编写一个对上下文敏感的应用程序(例如ASP.NET MVC控制器),那么您不应该使用ConfigureAwait(false),因为您将继续使用错误的线程。
< / LI>