WebAPI 控制器中的ConfigureAwait(false)

Vic*_*riu 4 c# async-await asp.net-web-api2 sonarlint

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

i3a*_*non 5

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

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

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

您可以避免ConfigureAwait在控制台应用程序或 Windows 服务中使用,尽管在适当的情况下继续使用它仍然是一个好习惯。

  • 但是:“当需要上下文的方法中的等待之后有代码时,不应使用ConfigureAwait。[...]对于 ASP.NET 应用程序,这包括使用 HttpContext.Current 或构建 ASP.NET 响应的任何代码,包括控制器操作中的返回语句。” (来自[此处](https://msdn.microsoft.com/en-us/magazine/jj991977.aspx))。我的理解是,是的,在库中您应该始终使用“ConfigureAwait(false)”,但在 GUI 代码或控制器中,这取决于您在等待后执行的操作。 (2认同)