假设我有两种情况:
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#。
你可以使用配置等待公共行动MVC控制器,它有助于防止交易锁,如果你的_userService.GetAuthViewModelAsync继续等待。
请看下面的链接来了解这个案例:
http://blog . Stephen cleary . com/2012/07/dont-block-on-async-code . html
如果 ASP.NET Core 应用程序中没有实际的上下文,则添加 应该不会造成任何伤害或好处。ConfigureAwait(false) 到您的可等待方法到控制器中。
但是,如果将来有可能最终出于某种原因,需要考虑一些背景,就像 ASP.NET 4一样,那将是一个不同的故事。我们不能冒险在不同的上下文中运行,除非我们不对此表示不满(在这种情况下,我们可以使用任何可用于处理的线程,从而可能提高性能)。
我在这里的选择是添加 ConfigureAwait(false),即使它没有被使用。
似乎我应该在所有不直接绑定到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中异步方法 的页面。