在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#。

在WebApi或MVC控制器中使用ConfigureAwait(false)是否有任何危险?

似乎我应该使用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)听起来不太好,因为它会使主线程等待,直到操作完成。我认为最好的方法是在你的服务/业务层和持久层中使用它。