【发布时间】:2019-11-12 05:57:18
【问题描述】:
在我们的项目中,我们只有同步方法,所以有一刻我们决定引入一些异步方法。
但在视图中使用异步操作似乎存在一些问题......
下面的同步动作“HomePartial”被转换为异步的“HomePartialAsync”动作(因此,没有剩下的同步动作)。
以下代码
@{
Layout = "~/Views/Shared/_LayoutPortal.cshtml";
}
<div class="col-lg-19 col-md-18 col-sm-24 col-xs-24">
<div class="row">
<div class="col-xs-24">
<div class="row">
@{Html.RenderAction<HomeController>(h => h.HomePartialAsync());}
@Html.Partial("Partials/_OffersPassion")
</div>
</div>
</div>
</div>
实际上抛出了一个错误
HttpServerUtility.Execute 在等待异步时阻塞 操作完成。
我的 Home 控制器的操作
[ActionName("HomePartial")]
public async System.Threading.Tasks.Task<ActionResult> HomePartialAsync()
{
return WebConfigManager.IsCMSactivated ? await GetHomeManifCMSBlocAsync() : await GetHomeManifBlocAsync();
}
我在@JamesS 这样的建议之后更新了它
[ActionName("HomePartial")]
public ActionResult HomePartial()
{
var asyncResult = WebConfigManager.IsCMSactivated ? GetHomeManifCMSBlocAsync() : GetHomeManifBlocAsync();
var result = Task.Run(() => asyncResult).Result;
return result;
}
但线程似乎仍然被阻塞,期待“结果”......
【问题讨论】:
-
您可以调用同步操作并使用
Task.Run(() => //async call).Result;调用您的异步函数 -
在视图中怎么做?
-
我会说只需调用同步操作,然后在控制器操作中。使用上述语法调用异步函数/方法。您可以像在
Html.Partial中一样进行所有同步操作 -
@JamesS
Task.Result是asp.net下死锁的秘诀。如果您不明白为什么,请阅读this。Task.Result通常是有毒的......在这里它是致命的。 -
视图不支持 ASP.NET Legacy Edition 中的异步代码。不过,ASP.NET Core 视图可以。
标签: c# .net asp.net-mvc asp.net-mvc-5