1

我对 ASP MVC 很陌生

我有一个用户可以选择的菜单选项列表。根据 MVC 架构,每个菜单选择都会触发一个控制器。

但不幸的是,其中一些控制器需要一些时间来执行才能做出可见的更改。因为大数据需要绑定到网格。所以浏览器一直挂起(显示加载)。

如果用户在耗时的菜单选项之后选择了可以轻松加载的选项,则会发生最坏的情况。

如果另一个控制器动作请求进来,有人可以帮忙解决一个控制器动作请求吗?现在它是所有用户选择的操作的总和

例如:如果用户选择 Menu1 ,然后选择 Menu2 。我的 Menu1 控制器操作需要一些时间才能执行。到那时,用户单击第一次单击时很容易加载的 Menu2。但是由于单击了 Menu2,用户必须等待很长时间。

4

1 回答 1

2

这有点老了,但我会尝试回答,因为我最近遇到了这个问题。如果您使用的是 MVC 5,则可以为您取消其他请求。诀窍是使用异步控制器操作并添加 CancellationToken 参数。

public async Task<ActionResult> MyReallySlowReport(CancellationToken cancellationToken)
{
    List<ReportItem> items;
    using (ApplicationDbContext context = new ApplicationDbContext())
    {
        items = await context.ReportItems.ToListAsync(cancellationToken);
    }
    return View(items);
}

当用户导航到另一个页面时,请求被取消。MVC 将向取消令牌发出请求已被取消的信号。只要您也像我上面那样将取消令牌传递给异步数据访问方法,查询将被取消,服务器将立即停止处理请求。

我在这里做了一个完整的解释:http ://www.davepaquette.com/archive/2015/07/19/cancelling-long-running-queries-in-asp-net-mvc-and-web-api.aspx

于 2015-07-21T00:38:58.493 回答