ConfigureAwait(false) 与 ASP.NET Core 相关吗?

问题描述 投票:0回答:2

我在 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 中,这方面是否有所不同?

.net asp.net-core async-await
2个回答
195
投票

ConfigureAwait
仅对在
SynchronizationContext
上下文中运行的代码有影响,而 ASP.NET Core 没有(ASP.NET“旧版”有)。

通用代码仍应使用它,因为它可能会使用

SynchronizationContext
运行。

ASP.NET Core 同步上下文

ConfigureAwait 常见问题解答


0
投票

经常没有提到的一件事是

TaskScheduler
。虽然 ASP.NET Core/.NET 5+ 的东西确实没有
SynchronizationContext
,但仍然完全有可能与不同的
TaskScheduler
进行交互。罕见?当然。但可能吗?绝对。

因此请记住,如果您正在使用自定义

TaskScheduler
或与之交互,并说
TaskScheduler
有自己的线程池,那么
ConfigureAwait(false)
会“让您脱离”该
TaskScheduler
及其线程池,并将您的延续扔回默认的 .NET 线程池。

在开发 .NET 作业编排器 Didact 时,我必须广泛处理这个问题。 Hangfire 还有一个带有自己的线程池的自定义

TaskScheduler
,尽管 Hangfire 最终在其内部引擎中的异步代码上使用同步块,所以这并不是什么大问题。

我的观点:只是不要忘记

ConfigureAwait(false)
也会影响
TaskScheduler
s。

© www.soinside.com 2019 - 2024. All rights reserved.