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"
编辑项目的规则集文件
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"
编辑项目的规则集文件