ConfigureAwait(false) 在 ASP.NET Core 中是否相关?

166

我在 GitHub 上遇到了一个问题 (https://github.com/HTBox/allReady/issues/1313),讨论了在 ASP.NET Core 中移除代码中的 ConfigureAwait(false),称其为多余且无作用。

ConfigureAwait(false) 的调用是多余的且没有任何作用。

我在这里找到的最好的解释是一个答案中的“旁注” (来自 Stephen Cleary, https://dev59.com/b1kS5IYBdhLWcg3wN0K_#40220190),其中提到:

ASP.NET Core 不再有 "context"

那么,在ASP.NET Core中是否真的不需要使用 ConfigureAwait(false) 呢(即使使用完整的 .Net Framework)?它在一些情况下是否具有性能上的实际收益或结果/语义上的差异呢?

编辑:在控制台应用程序或 IIS 中托管时,此方面是否有所不同?


9
这取决于您计划在哪里使用它。如果您想直接在ASP.NET Core应用程序中使用它,则不需要调用它(在ASP.NET传统版中也是如此)。但如果您编写库,则应始终使用 ConfigureAwait(false),因为该库可能被不同的应用程序(如ASP.NET Core、WPF、UWP、控制台等)使用。 - Tseng
1
ASP.NET Core默认以控制台应用程序的形式运行,据我所知,控制台应用程序没有同步上下文,所以对于默认的ASP.NET Core应用程序来说,即使使用了完整的框架,这听起来也是合理的。 - Joe White
@JoeWhite 好的,已经编辑了问题。如果我的ASP.NET Core应用程序在IIS中,会有什么不同吗? - Pedro Lorentz
3
在 IIS 中运行的 ASP.NET Core 应用程序仍然像控制台应用程序一样运行 - 唯一的区别是 IIS 启动和关闭应用程序实例(就像在传统的 ASP.NET 中管理 ASP.NET 工作进程的实例一样)。这不会改变 ASP.NET 应用程序内部的任何与线程相关的行为。(我指定“默认情况下”的唯一原因是,例如您可以将 ASP.NET Core 托管在 GUI 应用程序中,在那种情况下,您需要考虑同步上下文。) - Joe White
请注意,ConfigureAwait(false)在经典的ASP.NET中可能是相关的,但绝不是必要的。这是一种权衡:它可以在某种程度上减轻一些同步/异步死锁(这些本来就是设计缺陷--除非有人做了愚蠢的事情,否则它们不存在),并且偶尔可以通过不重新加载上下文来提高大约微秒级别的性能。代价是无法依赖上下文,并且需要在代码中使用ConfigureAwait。https://dev59.com/L4fca4cB1Zd3GeqPh1_F#28227165 - Dax Fohl
有没有官方链接表明在 .NET Core 中没有同步上下文?MSDN? - Royi Namir
1个回答

184

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

通用代码仍应使用 ConfigureAwait,因为它可能会在 SynchronizationContext 上下文中运行。

ASP.NET Core SynchronizationContext

ConfigureAwait FAQ


23
只想稍微澄清一下,非核心环境下的ASP.NET确实有同步上下文,但ASP.NET Core没有。 - Scott Chamberlain
16
一个ASP.NET Core应用程序并不是托管在IIS中,而IIS只是充当反向代理。 - Paulo Morgado
3
我已经更新了答案,加入了Stephen Cleary最近的一篇文章。但是没错,ASP.NET Core就是ASP.NET Core。 - Paulo Morgado
18
@NamNgo,虽然这是一个旧帖子,但Stephen Cleary在Paulo上面链接的一个问题中澄清了这一点。他说:“决定SynchronizationContext的是框架(ASP.NET Core而不是ASP.NET Classic),而不是运行时(.NET Core而不是.NET 4.6.2)”。 - Gavin Sutherland
1
这个问题显然是关于ASP.NET Core的,但我想补充一点,即使用该框架的应用程序理论上可能会创建和配置自己的SynchronizationContext,或者一个奇怪的库可能会这样做。如果你是应用程序的开发人员,你应该知道任何这样的事情,很可能应用程序中没有这样的疯狂行为。如果你是一个库的开发人员,即使该库是用于ASP.NET Core的,你也应该使用ConfigureAwait,或者记录它与同步上下文的使用不受支持。 - Palec
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接