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

Ped*_*ntz 70 .net async-await asp.net-core

我在GitHub上偶然发现了一个问题(https://github.com/HTBox/allReady/issues/1313),在那里他们讨论了如何ConfigureAwait(false)ASP.NET核心中删除代码

呼叫ConfigureAwait(false)是多余的,什么都不做

我能找到的最好的答案是一个"旁注"(来自Stephen Cleary,https: //stackoverflow.com/a/40220190/2805831 )

ASP.NET Core不再具有"上下文"

那么,ASP.NET Core中ConfigureAwait(false)真的没必要(即使使用完整的.Net Framework)?在某些情况下,它在性能方面是否有任何实际的好处,或者在结果/语义上有所不同?

编辑:如果我将其作为控制台应用程序托管或在IIS中,它在这方面有所不同吗?

Pau*_*ado 73

ConfigureAwait只对在SynchronizationContextASP.NET Core没有的上下文中运行的代码有影响(ASP.NET"Legacy"会这样做).

通用代码仍然应该使用它,因为它可能正在运行SynchronizationContext.

ASP.NET Core SynchronizationContext

  • 只是想稍微澄清一下,ASP.NET在非核心环境中确实有同步上下文,但ASP.NET核心却没有. (12认同)
  • @NamNgo.欣赏这是一个旧帖子,但Stephen Cleary在帖子中的一个[问题](http://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html#comment-3582687662)中澄清了这一点.保罗在上面联系 _"它是确定SynchronizationContext的框架(ASP.NET Core而不是ASP.NET Classic),而不是运行时(.NET Core而不是.NET 4.6.2)"_ (12认同)
  • IIS核心应用程序不在IIS中托管.IIS就像反向代理一样. (4认同)
  • 我已经用 Stephen Cleary 最近的一篇文章更新了答案。但是,是的,ASP.NET Core 就是 ASP.NET Core。 (2认同)

Alf*_*ero 22

那这个呢?

At this moment (Feb-2020) Developers on MS Blog recommends use ConfigureAwait(false) in order to Improving performance, Avoiding deadlocks. https://devblogs.microsoft.com/dotnet/configureawait-faq/

I’ve heard ConfigureAwait(false) is no longer necessary in .NET Core. True? False. It’s needed when running on .NET Core for exactly the same reasons it’s needed when running on .NET Framework. Nothing’s changed in that regard.

  • 据此,我想说在大多数情况下是不需要的。除非您使用自定义同步上下文或使用这样做的库。 (6认同)
  • *如果某些用户代码(或您的应用程序正在使用的其他库代码)设置自定义上下文并调用您的代码,或者在计划到自定义 TaskScheduler 的任务中调用您的代码,那么即使在 ASP.NET Core 中,您的等待也可能会看到非-默认上下文或调度程序会导致您想要使用ConfigureAwait(false)。当.* (2认同)