我在 GitHub 上偶然发现了一个问题 (https://github.com/HTBox/allReady/issues/1313),他们讨论了如何从代码中删除
ConfigureAwait(false)
,声称在 ASP.NET Core 中
对
的调用是多余的并且没有任何作用ConfigureAwait(false)
我在这里能找到的最好的是答案中的“旁注”(来自 Stephen Cleary,https://stackoverflow.com/a/40220190/2805831)告诉
ASP.NET Core 不再有“上下文”
那么,
ConfigureAwait(false)
在ASP.NET Core中真的没有必要吗(即使使用完整的.Net Framework)?在某些情况下它是否有真正的性能提升或结果/语义上的差异?
编辑: 如果我将其托管为控制台应用程序或在 IIS 中,这方面是否有所不同?
ConfigureAwait
仅对在 SynchronizationContext
上下文中运行的代码有影响,而 ASP.NET Core 没有(ASP.NET“旧版”有)。
通用代码仍应使用它,因为它可能会使用
SynchronizationContext
运行。
经常没有提到的一件事是
TaskScheduler
。虽然 ASP.NET Core/.NET 5+ 的东西确实没有 SynchronizationContext
,但仍然完全有可能与不同的 TaskScheduler
进行交互。罕见?当然。但可能吗?绝对。
因此请记住,如果您正在使用自定义
TaskScheduler
或与之交互,并说 TaskScheduler
有自己的线程池,那么 ConfigureAwait(false)
会“让您脱离”该 TaskScheduler
及其线程池,并将您的延续扔回默认的 .NET 线程池。
在开发 .NET 作业编排器 Didact 时,我必须广泛处理这个问题。 Hangfire 还有一个带有自己的线程池的自定义
TaskScheduler
,尽管 Hangfire 最终在其内部引擎中的异步代码上使用同步块,所以这并不是什么大问题。
我的观点:只是不要忘记
ConfigureAwait(false)
也会影响 TaskScheduler
s。