【问题标题】:How can i make Recursion Asynchronous using Async and Await Keyword?如何使用 Async 和 Await 关键字使递归异步?
【发布时间】:2013-05-14 04:47:45
【问题描述】:

我正在从数据库中获取多级动态菜单。目前我已经成功调用它,但我想让它异步。
这是我的代码;

protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var menus = Uow.Menus.GetAll()
        .Select(m => new ParentMenuViewModel()
        {
            MenuId = m.MenuId,
            Name = m.Name,
            ParentId = m.ParentId
        })
        .ToList<ParentMenuViewModel>();
    ViewBag.Menus = CreateVM(0, menus);
    base.OnActionExecuting(filterContext);
}

public IEnumerable<ParentMenuViewModel> CreateVM(int parentid, List<ParentMenuViewModel> list)
{
    return list.Where(m=> m.ParentId==parentid)
        .Select(m=> new ParentMenuViewModel()
        {
            MenuId = m.MenuId,
            Name = m.Name,
            ParentId = m.ParentId,
            ChildMenus = CreateVM(m.MenuId, list)
        });
}

那么,如何使用 async 和 await 关键字来实现异步?
请注意,它会循环直到孩子完全加载;
让它异步(上面的代码)甚至是一个好习惯吗?

【问题讨论】:

  • 除非你有一个实际的异步操作(你没有),否则让它异步是没有意义的
  • 那么,如果我将其标记为异步,这将没有积极的反馈?

标签: c# asp.net-mvc asp.net-mvc-4 asynchronous async-await


【解决方案1】:

很遗憾,async 操作过滤器不可用(目前);见this question。您可以vote here 让 MVC 团队添加此功能。

一旦 MVC 支持 async 操作过滤器,您就可以使用,例如,GetAllAsync。递归部分不需要任何 async 功能,因为它不受 I/O 限制。

【讨论】:

  • 如何让CreateVM 方法异步?
  • CreateVM 不会从async 中受益;查看我的编辑。
猜你喜欢
  • 2012-11-28
  • 1970-01-01
  • 2017-05-13
  • 2019-01-17
  • 2016-09-03
  • 2015-05-04
  • 1970-01-01
  • 2013-04-11
  • 1970-01-01
相关资源
最近更新 更多