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