首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在WebApi或MVC控制器中使用ConfigureAwait(false)有什么危险吗?

在WebApi或MVC控制器中使用ConfigureAwait(false)有什么危险吗?
EN

Stack Overflow用户
提问于 2016-10-23 09:57:57
回答 4查看 17.2K关注 0票数 55

假设我有两个场景:

1) WebApi控制器

代码语言:javascript
复制
    [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);
        }

    }

MVC 2)控制器

代码语言:javascript
复制
    [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的异步调用上使用ConfigureAwait(false)。我不知道这是什么意思...我应该在上面的所有await调用中使用.ConfigureAwait(false)吗?

我正在寻找一些明确的指导方针,关于我应该在什么时候使用它。

这个问题不同于Best practice to call ConfigureAwait for all server-side code --我想在WebApi和MVC的上下文中寻找这个方法的用例的直接答案,而不是一般的C#。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-24 21:50:16

似乎我应该在所有没有直接绑定到UI的异步调用上使用ConfigureAwait(

)。

不完全是。这个指导原则在这里没有意义,因为没有UI线程。

传递给ConfigureAwait的参数是continueOnCapturedContext,它更清楚地解释了场景。只要async方法的其余部分不依赖于当前上下文,就可以使用ConfigureAwait(false)

在ASP.NET 4.x中,“上下文”是请求上下文,包括HttpContext.Current和区域性等内容。还有--这是没有文档记录的部分--很多ASP.NET助手方法确实依赖于请求上下文。

(附注: ASP.NET核心不再有“上下文”)

我应该在上面所有的等待调用中使用.ConfigureAwait(false)吗?

我还没有听到任何关于这方面的明确指导,但我怀疑这是可以的。

在我自己的代码中,我从不在控制器操作方法中使用ConfigureAwait(false),因此它们已经在请求上下文中完成。只是在我看来更合适些。

票数 82
EN

Stack Overflow用户

发布于 2020-01-17 19:08:31

如果ASP.NET核心应用程序中没有实际的上下文,那么将.ConfigureAwait(false)添加到控制器中的可等待方法中应该没有坏处,也不会有什么好处。

但是,如果将来有机会,无论出于什么原因,像ASP.NET 4中那样需要考虑上下文,那就是另一回事了。我们不能冒险在不同的上下文中运行,除非我们不关心它(在这种情况下,我们可以使用任何可用的线程来处理,从而可能提高性能)。

我在这里的选择是添加ConfigureAwait(false),即使它不被使用。

票数 1
EN

Stack Overflow用户

发布于 2016-10-24 18:44:43

你可以在公共动作MVC控制器上使用ConfigureAwait,如果你的_userService.GetAuthViewModelAsync一直在等待,它有助于防止交易锁定。如果异步服务保持等待,则可能阻塞UI httpcontext,则会引发死锁。

请查看下面的链接以了解此案例:

http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40198816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档