何时在MVC 6中的视图中使用@await Html.PartialAsync

时间:2015-02-24 20:59:55

标签: razor asp.net-core asp.net-core-mvc

我在Scott Hanselman的一篇博客中注意到他在使用.Net 5(MVC 6)时在他的视图中使用了以下代码:

@await Html.PartialAsync("_LoginPartial")

VS

@Html.Partial("_LoginPartial")

还有关于何时应该使用哪一个的文件?

4 个答案:

答案 0 :(得分:33)

这实际上是一个非常有趣的问题和场景。在某种程度上,异步是新的热点(尽管它并不是全新的)。实体框架6使用异步方法和每个......单个......文件...点击...突然开始使用异步处理所有内容。我想我们在这里看到的有点相同。 MVC 6支持渲染部分内容的异步,因此OMG我们现在只是来使用异步。

Async服务于一个非常特定的目的。它允许活动线程返回到池以在当前任务处于等待状态时执行其他任务。关键部分是“等待状态”。某些任务与async不兼容。像复杂财务分析这样的CPU绑定工作从不允许线程进入等待状态,因此即使您将其设置为异步,所有内容也可以有效地作为同步运行。另一方面,涉及网络延迟(从Web API请求资源,查询数据库等)或I / O绑定(读/写文件等)的事情有时可能具有线程所在的时段。在继续处理之前等待其他一些过程完成。

专门研究渲染部分,唯一不完全受CPU限制的部分是从文件系统中读取视图文件本身。虽然在技术上足以使其符合异步的条件,但实际上需要多长时间才能阅读本质上可能小于50KB的文本文件。当线程被传回池时,可能是时候请求它回来了,所以你实际上在那时实际上使用的资源效率更低。

长短,不要陷入“它可以做异步,所以我必须做异步”的陷阱。应根据其中是否存在实际价值来评估每种用途。 Async有很多开销,如果你只是谈论几毫秒的等待时间,那么可能不值得花费额外的开销。

答案 1 :(得分:11)

根据部分视图的ASP.NET MVC文档。 https://docs.asp.net/en/latest/mvc/views/partial.html

  

PartialAsync方法适用于包含异步代码的部分视图(尽管通常不鼓励使用视图中的代码):

也是页面上的注释。

  

如果您的视图需要执行代码,建议的模式是使用视图组件而不是部分视图。

所以你应该使用reg [15:0] litlen_buff0[3:0]; reg [1:0] rcount0; assign litlen_buff0_out = litlen_buff0[rcount0]; 并避免Partial,如果你发现自己有PartialAsync,你应该问自己是否做错了,也许你应该是改为使用ViewComponent或将逻辑从视图移动到控制器。

答案 2 :(得分:1)

关于"等待Html.PartialAsync" - 此链接可以帮助您 - http://aspnetwebstack.codeplex.com/workitem/601(也可以按照评论)(至于问题到底是什么)。

我正在建立一个面向公众的网站,建立在MVC 6和#34;等待Html.PartialAsync"比#34; Html.Partial"更快 - 尤其是当视图包含大量组件时。

取出" await" Html.PartialAsync显然不起作用,Html.PartialAsync吐出类型名称(即" System.Threading.Tasks.Task`1 [Microsoft.AspNet.Mvc.Rendering.HtmlString]")而不是实际的观点。

答案 3 :(得分:0)

只是为了让那些在 asp.net core 时代访问的人保持最新状态。

目前,根据文档:

<块引用>

Partial 和 RenderPartial 分别是 PartialAsync 和 RenderPartialAsync 的同步等效项。不建议使用同步等效项,因为在某些情况下它们会死锁。 同步方法将在未来版本中移除。

完整内容: Partial views in ASP.NET Core

要了解为什么会出现此问题,您可以查看此 github 条目:

https://github.com/aspnet/Mvc/issues/7083

但长话短说,看起来 Partial 的同步版本只是使用 GetResult 调用异步版本,这在某些情况下会导致死锁。

总而言之,没有真正的理由不使用异步版本。有理由不使用同步的。 即使在视图中没有巨大负载和花哨逻辑的情况下,实际上几乎没有机会陷入死锁......但如果你这样做,调试和修复将非常困难。

var result = htmlHelper.RenderPartialAsync(partialViewName, htmlHelper.ViewData.Model, viewData: null);
result.GetAwaiter().GetResult();