2

所以,这里是破败...

我的 MVC 4 应用程序有一个主布局页面,其中包含一些动态信息,需要强类型化到特定域实体才能获取该信息。为了让我的文件更干净,我将输入的字段提取到部分视图中。

为了获取我需要的实体并将其映射到部分视图模型,我有一个 LayoutController 和一个返回Task<PartialViewResult>. 此操作使用服务层async调用await实体的 Web API 项目。它将该实体按摩到视图模型中,然后返回PartialView("_LayoutPartial", viewModel).

在 _Layout 页面中,部分通过以下方式调用:

@{Html.RenderAction("LayoutInfo", "Layout", new { /*entity primary key*/ });}

我已经逐步完成了代码,它确实得到了正确的实体,但是在返回部分视图任务之后,我得到了每个人最喜欢的服务器错误页面,并出现以下错误:

HttpServerUtility.Execute blocked while waiting for an asynchronous operation to complete.

我做了一些谷歌搜索和搜索,但不知道这实际上意味着什么。我是否正确地考虑了这一点?

4

1 回答 1

2

该错误消息意味着您正在尝试从同步方法中调用(并等待!)异步方法。在您的特定情况下,同步方法是 HtmlHelper.RenderAction,异步方法是您的任务返回操作方法。出现错误的原因是写异步Task-returning方法的点大概是为了避免阻塞一个线程,但是RenderAction要等到Task完成后才能返回,所以RenderAction在等待操作完成的时候就阻塞了。

一种选择是使 RenderAction 调用的方法是同步的而不是异步的,记住这将继续阻塞原始线程。另一种选择是从原始操作方法中异步填充布局数据,然后通过 ViewData 将其传递给布局页面。

于 2012-10-25T01:42:11.980 回答