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

Mar*_*ora 14 c# asynchronous

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

我只是想确保我没有遗漏某些东西,当我认为这只适用于实际电流SynchronizationContextTaskScheduler播放时,对吗?

如果我有一个响应消息/命令/等的Windows服务应用程序.异步,它总是只使用默认的调度程序=可能是等待完成的相同的线程池线程将执行延续,因此没有死锁和使用时没有性能差异ConfigureAwait(false),对吗?

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

Ree*_*sey 10

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

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

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

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

  • 那么你的陈述“在我看来你永远不应该使用这个”是误导性的,并不代表你声称你对他的文章的理解。 (6认同)
  • @maracuja-juice——你误解了那篇文章的作者 (Stephen Cleary)。他的意思是不要将 ConfigureAwait(false) 用于避免阻塞代码中的死锁的唯一目的。相反,不要阻塞;通过使用 async/await 来避免死锁,包括在调用堆栈中的上下调用堆栈,包括在根。 (3认同)
  • 在我看来,您永远不应该使用它,因为它充其量只是一种黑客行为并且会使您的代码显着混乱。“使用 ConfigureAwait(false) 来避免死锁充其量只是一个黑客)” https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html (2认同)
  • 这正是我所理解的@rory.ap (2认同)