SonarLint 是否应该在 ASP.NET Web API 控制器中触发S3216 ?似乎这条规则是针对桌面应用程序的,在 ASP.NET 中上下文完全不同,没有死锁的危险。还是我错过了什么?
2 回答
ConfigureAwait(false)
当您不需要捕获上下文时,您仍应在 WebAPI 中使用。
ConfigureAwait
控制是否恢复捕获SynchronizationContext
或不。确实,这在 UI 应用程序中是一个更痛苦的问题,但它在SynchronizationContext
所有 UI 应用程序和所有 asp.net 应用程序的任何地方都是相关的。
在 UI 应用程序中,资源SynchronizationContext
管理的是单个 UI 线程,因此如果您阻止它,您可能会死锁。在 asp.net 应用程序中,资源是请求上下文,您也可以对其进行死锁。
您可以避免ConfigureAwait
在控制台应用程序或 Windows 服务中使用,尽管在适当的情况下继续使用它仍然是一个好习惯。
@VictorGrigoriu,我们仅检查编译单元的输出类型是否为 DLL,并且我们仅报告 DLL 中的问题。您是对的,我们报告了在 DLL 中仍需要切换回原始上下文的情况。一般来说,这是一件很难弄清楚的事情,但我们可以添加对顶级 Web 应用程序集的检查。我们需要想出一个好方法来做到这一点,或者默认禁用规则以不产生误报。
我创建了一张票来跟踪这个问题:https ://jira.sonarsource.com/browse/SLVS-790 。
在我们提出永久解决方案之前的其他选项:如果您觉得这很烦人,您可以在给定项目上本地禁用此规则。为此,您需要通过“references/analyzers/open active rule set”编辑项目的规则集文件