在重写的void中运行async方法

本文关键字:运行 async 方法 void 重写 | 更新日期: 2023-09-27 17:50:48

我目前正在构建一个ASP。NET MVC应用程序。我试图添加项目到ViewBag属性在我的网站的所有页面。为了实现这一点,我创建了一个基本控制器,所有站点控制器都继承它。

添加到ViewBag,我已经覆盖了onactionexecution方法:protected override void OnActionExecuting(ActionExecutingContext filterContext)

我知道MVC5的onactionexecution方法不是异步的,这就是为什么我遇到这个问题。我需要能够调用以下代码的某种形式来检索最新的项目并将它们放入ViewBag:

IList<PlaceListItemViewModel> places = await GetLatestPlaces(3);
ViewBag.FooterLatestPlaces = places;

使用GetLatestPlaces(3).Result只会导致死锁,所以这不是一个选项。

谁能给我一个如何实现这一点的选项。它也不必重写onactionexecution方法,如果有另一种方法来添加项目到ViewBag的每个页面(而不是从每个控制器中的每个动作调用代码),我开放使用该方法。

不幸的是,我不能GetLatestPlaces方法是非异步的,因为它使用MongoDB 2.0驱动程序,这是异步的所有方式。

在重写的void中运行async方法

一般有两种方法可以达到目的:

  1. async库中使用ConfigureAwait(false)。在你的情况下,你应该在GetLatestPlaces()方法中做。
  2. 在不同的线程中调用async方法,以便不阻塞当前上下文。所以你的代码看起来像这样:

    IList<PlaceListItemViewModel> places = Task.Run(async () =>  await GetLatestPlaces(3)).Result;
    

更多信息请看Stephen Cleary的博文