在WebApi或MVC控制器中使用ConfigureAwait(false)是否有任何危险?
本文关键字:是否 false 任何 危险 ConfigureAwait MVC WebApi 控制器 | 更新日期: 2023-09-27 18:14:19
假设我有两个场景:
1) WebApi控制器 [System.Web.Http.HttpPost]
[System.Web.Http.AllowAnonymous]
[Route("api/registerMobile")]
public async Task<HttpResponseMessage> RegisterMobile(RegisterModel model)
{
var registerResponse = await AuthUtilities.RegisterUserAsync(model, _userService, User);
if (registerResponse.Success) {
var response = await _userService.GetAuthViewModelAsync(model.Username, User);
return Request.CreateResponse(HttpStatusCode.OK, new ApiResponseDto() { Success = true, Data = response });
}
else {
return Request.CreateResponse(HttpStatusCode.OK, registerResponse);
}
}
2) MVC控制器
[Route("public")]
public async Task<ActionResult> Public()
{
if (User.Identity.IsAuthenticated)
{
var model = await _userService.GetAuthViewModelAsync(User.Identity.Name);
return View("~/Views/Home/Index.cshtml", model);
}
else
{
var model = await _userService.GetAuthViewModelAsync(null);
return View("~/Views/Home/Index.cshtml", model);
}
}
我一直在阅读什么时候我应该使用ConfigureAwait
,似乎我应该使用ConfigureAwait(false)
上所有我的异步调用不直接绑定到UI。我不知道那是什么意思…我应该在所有上述await
调用上使用.ConfigureAwait(false)
吗?
我正在寻找一些明确的指导方针,关于什么时候我应该使用它。
这个问题与为所有服务器端代码调用ConfigureAwait的最佳实践不一样-我正在寻找在WebApi和MVC上下文中该方法的用例的直接答案,而不是一般的c#。
似乎我应该使用ConfigureAwait(false)对我所有的异步调用,不直接绑定到UI。
不完全是。这个准则在这里没有意义,因为没有UI线程。
传递给ConfigureAwait
的参数为continueOnCapturedContext
,说明场景更清晰。当async
方法的其余部分不依赖于当前上下文时,您需要使用ConfigureAwait(false)
。
在ASP。净4。x中,"上下文"是请求上下文,其中包括HttpContext.Current
和文化等内容。而且——这是未归档的部分——很多ASP。. NET助手方法是否依赖于请求上下文。
(旁注:ASP。. NET Core不再有"context")
我应该使用。configureawait (false)对所有上述等待调用?
我还没有听到任何关于这方面的明确指导,但我想这是可以的。
在我自己的代码中,我从不在我的控制器动作方法中使用ConfigureAwait(false)
,这样它们就已经在请求上下文中完成了。
如果ASP中没有实际的上下文。. NET Core应用程序中,将. configureawait (false)添加到控制器中的可等待方法中既无害也无害。
然而,如果最终有机会在未来,无论出于何种原因,在ASP中需要考虑上下文之类的东西。NET 4,那将是一个不同的故事。我们不能冒险在不同的上下文中运行,除非我们不在乎它(在这种情况下,我们可以使用任何可用的线程进行处理,从而可能提高性能)。
我在这里的选择是添加ConfigureAwait(false),即使它不使用
你可以在公共动作MVC控制器上使用ConfigureAwait,它有助于防止交易锁,如果你的_userService。GetAuthViewModelAsync保持等待。如果异步服务保持等待,它会引发死锁,因此它可能会阻塞UI的httpcontext。
请看下面的链接来理解这个案例:
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html在控制器中使用ConfigureAwait(false)
听起来不太好,因为它会使主线程等待,直到操作完成。我认为最好的方法是在你的服务/业务层和持久层中使用它。