说我有两种情况:

1)WebApi Controller

    [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 Controller
    [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,似乎应该在所有不直接与UI绑定(bind)的异步调用上使用ConfigureAwait(false)。我不知道那是什么意思……在上述所有.ConfigureAwait(false)调用中都应该使用await吗?

我正在寻找一些明确的指导,以明确何时应该使用它。

这个问题与Best practice to call ConfigureAwait for all server-side code不同-我正在WebApi和MVC的背景下(而非一般的C#)寻找此方法用例的简单答案。

最佳答案



不完全的。该指南在这里没有意义,因为没有UI线程。

传递给ConfigureAwait的参数是continueOnCapturedContext,它可以更清楚地说明场景。每当该ConfigureAwait(false)方法的其余部分不依赖于当前上下文时,您都想使用async

在ASP.NET 4.x中,“上下文”是请求上下文,其中包括HttpContext.Current和区域性。另外-这是未记录的部分-很多ASP.NET帮助器方法确实取决于请求上下文。

(附带说明:ASP.NET Core不再具有“上下文”)



我还没有听到任何坚定的指导,但是我认为这还可以。

在我自己的代码中,我从未在 Controller 操作方法中使用ConfigureAwait(false),因此它们已在请求上下文中完成。对我来说似乎更合适。

关于c# - 在WebApi或MVC Controller 中使用ConfigureAwait(false)是否有危险?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40198816/

10-10 10:57