当前位置: 首页 > 知识库问答 >
问题:

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

马新觉
2023-03-14

假设我有两种情况:

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);
        }
    }

我一直在阅读什么时候应该使用配置等待,似乎我应该在所有未直接绑定到UI的异步调用上使用配置等待(false)。不过,我不知道这意味着什么...我应该使用吗?在所有上述wait调用上配置等待(false)

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

这个问题不同于为所有服务器端代码调用ConfigureAwait的最佳实践——我在寻找一个关于这个方法在WebApi和MVC环境中的用例的直接答案,而不是一般的C#。

共有3个答案

冷正青
2023-03-14

你可以使用配置等待公共行动MVC控制器,它有助于防止交易锁,如果你的_userService.GetAuthViewModelAsync继续等待。

请看下面的链接来了解这个案例:

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

廖夜洛
2023-03-14

如果 ASP.NET Core 应用程序中没有实际的上下文,则添加 应该不会造成任何伤害或好处。ConfigureAwait(false) 到您的可等待方法到控制器中。

但是,如果将来有可能最终出于某种原因,需要考虑一些背景,就像 ASP.NET 4一样,那将是一个不同的故事。我们不能冒险在不同的上下文中运行,除非我们不对此表示不满(在这种情况下,我们可以使用任何可用于处理的线程,从而可能提高性能)。

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

唐威
2023-03-14

似乎我应该在所有不直接绑定到UI的异步调用上使用ConfigalAwait(false)。

不完全是。这条准则在这里没有意义,因为没有UI线程

传递给< code > configurewait 的参数是< code > continueOnCapturedContext ,它更清楚地解释了这种情况。只要< code>async方法的其余部分不依赖于当前上下文,就要使用< code > configurewait(false)。

在ASP.NET4. x中,“上下文”是请求上下文,它包括HttpContext.Current和区域性等内容。此外——这是未记录的部分——许多ASP.NET助手方法确实依赖于请求上下文。

(附注:ASP.NET核心不再有“背景”)

我应该使用。所有上述Await调用的configurewait(false )?

我还没有听到任何关于此的坚定指导,但我怀疑这没关系。

在我自己的代码中,我从未在控制器操作方法中使用< code > configurewait(false),因此它们已经在请求上下文中完成。我觉得这样更好。

 类似资料:
  • 在我的程序/服务中非常有效。但是在Web API 2控制器中以这种方式使用会导致控制器完全冻结,并且永远不会返回响应。 我做了一些研究,相信这里提到了罪魁祸首:http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html 我绝对不想异步使用该函数。上面的函数是如此的核心,并且隐藏在4个包装器中,所以仅仅为了支持一个web a

  • 问题内容: 我正在构建一个客户端脚本繁重的ASP.NET MVC应用程序,它将使用JSON和jQuery来操作DOM。 我的理解是 Web API Controller 和 MVC Controller 都可以返回JSON。 在我的情况下,应该使用 Web API控制器 还是 MVC控制器 ? 问题答案: 可以在任何ASP.NET应用程序中创建并托管Web API控制器,而不仅仅是MVC应用程序。

  • 根据我的场景,我应该使用Web API控制器还是MVC控制器?

  • 我在各个地方看过ConfigureAwait(包括SO问题),以下是我的结论: 配置等待(true):在运行wait之前在同一线程上运行其余代码。 配置等待(false):在运行等待代码的同一线程上运行其余代码。 如果wait后面跟着访问UI的代码,则该任务应附加。否则,由于另一个线程访问UI元素,将发生InvalidoperationException。 我的问题是: 我的结论正确吗? 配置等待

  • 在具有管道和转发功能的MIPS体系结构上: add指令将在步骤3(执行操作)准备好结果,但我假设sw指令希望在步骤2(指令解码)得到结果 David A. Patterson的《计算机组织与设计》一书中有一个已解决的练习:在以下代码段中找到危险并重新排序指令以避免任何管道停滞: 解决方案: 在解决方案中,它正确识别加载使用危险并相应地重新排列代码,但是否也存在执行存储危险?

  • 问题内容: 我有两个MVC网站。站点1的控制器使用以下代码调用站点2 我可以直接浏览URL并查看JSON。但是从MVC中的对等网站下载JSON的正确方法是什么? 问题答案: 你或许应该把控制器方法为方法和用途,以避免死锁。 Microsoft的ASP.NET教程包括有关ASP.NET MVC 4中异步方法 的页面。