WebAPI控制器中的ConfigureAwait(false)

时间:2016-02-08 08:50:47

标签: c# async-await asp.net-web-api2 sonarlint

SonarLint是否应该在ASP.NET Web API控制器中触发S3216?看来这个规则适用于桌面应用程序,在ASP.NET中,上下文完全不同,没有死锁的危险。或者我错过了什么?

2 个答案:

答案 0 :(得分:4)

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

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

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

您可以避免在控制台应用程序或Windows服务中使用ConfigureAwait,但在适当的地方继续使用它仍然是一种很好的做法。

答案 1 :(得分:0)

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

我已创建了一张跟踪此问题的故障单:https://jira.sonarsource.com/browse/SLVS-790

在我们提出永久解决方案之前的其他选项:如果您觉得这是一个烦恼,您可以在给定项目的本地禁用此规则。为此,您需要通过"参考/分析器/打开活动规则集"

来编辑项目的规则集文件。
相关问题