【问题标题】:Render Async Actions in a View在视图中呈现异步操作
【发布时间】: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(() =&gt; //async call).Result; 调用您的异步函数
  • 在视图中怎么做?
  • 我会说只需调用同步操作,然后在控制器操作中。使用上述语法调用异步函数/方法。您可以像在Html.Partial中一样进行所有同步操作
  • @JamesS Task.Result 是asp.net下死锁的秘诀。如果您不明白为什么,请阅读thisTask.Result 通常是有毒的......在这里它是致命的。
  • 视图不支持 ASP.NET Legacy Edition 中的异步代码。不过,ASP.NET Core 视图可以。

标签: c# .net asp.net-mvc asp.net-mvc-5


【解决方案1】:

我个人会从视图中调用ActionResult,然后从中调用异步函数。

查看:

@Html.Partial("//HomePartial path")

控制器:

public ActionResult HomePartial()
{
    var something = Task.Run(() => the call to the asynchronous function).Result;

    return PartialView("//partial path") //etc
}

就像我个人所说的那样,这就是我会做的,但是使用这种方法会锁定一个线程,直到异步函数完成。如果它不经常被调用,这很好,但是如果它被大量调用,您可能会看到出现问题。

【讨论】:

  • 我需要用一些东西替换@{Html.RenderAction&lt;HomeController&gt;(h =&gt; h.HomePartialAsync());}...
  • 是的。如果你简单地用@html.Action()@Html.Partial()替换它并调用上面的函数,你可以渲染信息
  • 所以您建议将异步操作回滚为同步操作?因为我们只是将代码从同步切换到异步......(在更新的 OP 中查看我的控制器代码)
  • @Serge 不一定适合所有人。例如,如果在那个Task.Run(() async =&gt; cal to whatever) 中我建议你调用一个部分,然后在那个部分中你可以调用一个异步方法,它应该不会导致任何问题。但是,我不相信您可以像您拥有的那样调用异步函数。
  • 如何将“某物”与退货联系起来?
猜你喜欢
  • 2021-08-31
  • 2014-05-04
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-21
相关资源
最近更新 更多