在Console / Win服务应用程序中不需要ConfigureAwait(false),对吗?

时间:2014-09-12 22:20:55

标签: c# asynchronous

我一直在使用async / await一段时间,但最近深入研究,并阅读了许多最佳实践提示,默认情况下始终使用ConfigureAwait(false)来防止死锁和提高绩效。

我只是想确保我没有遗漏某些东西,因为我认为这仅适用于实际当前SynchronizationContextTaskScheduler的情况,对吗?

如果我有一个响应消息/命令/等的Windows服务应用程序。异步地,它总是只使用默认的scheduler =可能与awaitable completed on相同的线程池线程将执行continuation,因此使用ConfigureAwait(false)没有死锁和性能差异,对吗?

我不能把它放在那里,但我非常讨厌噪音代码......

1 个答案:

答案 0 :(得分:9)

总的来说,这是事实。在控制台或服务方案中工作时,没有安装SynchronizationContext(默认情况下为 ),因此continueOnCapturedContext中的ConfigureAwait选项无效,这意味着您可以安全地删除它而不改变运行时行为。

但是,可能存在例外情况,因此我会建议您在适当的时候编写代码,包括ConfigureAwait(false)

即使在控制台或服务应用程序中包含它的主要优点是:

  1. 以后,代码可以在其他应用程序中重用。如果您选择重复使用此代码,则不必跟踪因不包含此错误而产生的错误。
  2. 如果您在运行时碰巧安装(或使用安装的库)SynchronizationContext,您的方法的行为将不会发生变化。