WebAPI 控制器中的 ConfigureAwait(false)

ConfigureAwait(false) in WebAPI controller

SonarLint 是否应该在 ASP.NET Web API 控制器中触发 S3216?这条规则似乎是针对桌面应用程序的,在 ASP.NET 上下文中完全不同,没有死锁的危险。还是我遗漏了什么?

当您不需要捕获上下文时,您仍然应该在 WebAPI 中使用 ConfigureAwait(false)

ConfigureAwait 控制是否在捕获的 SynchronizationContext 上恢复。确实,这在 UI 个应用程序中是一个更痛苦的问题,但它与任何有 SynchronizationContext 的地方相关,即所有 UI 个应用程序和所有 asp.net 个应用程序。

在 UI 应用程序中,资源 SynchronizationContext 管理的是单个 UI 线程,因此如果您阻止它可能会死锁。在 asp.net 应用程序中,资源是请求上下文,您也可以在其上死锁。

您可以避免在控制台应用程序或 windows 服务中使用 ConfigureAwait,但在适当的地方继续使用它仍然是一个好习惯。

@VictorGrigoriu,我们只检查编译单元的输出类型是否为 DLL,并且我们仅报告 DLL 中的问题。你是对的,我们报告了在 DLL 中你仍然需要切换回原始上下文的情况。一般来说,这是一件很难弄清楚的事情,但我们可以添加对顶级 Web 应用程序程序集的检查。我们需要想出一个好的方法来做到这一点,或者默认禁用规则以不产生误报。

我已经创建了一个工单来跟踪这个问题:https://jira.sonarsource.com/browse/SLVS-790

在我们提出永久解决方案之前还有其他选择:如果您觉得这很烦人,您可以在给定项目上本地禁用此规则。为此,您需要通过 "references/analyzers/open active rule set"

编辑项目的规则集文件