0

在我的控制器中,我需要进行一些可能需要很长时间的操作,所以我想在每个步骤结束时更新视图。我是 MVC 的初学者,根据我所知道的,每次我想从控制器更新视图时,我都必须做类似的事情

ViewBag.Result = "OK";
return View();

但在这种情况下,控件转到视图,控制器无法继续其操作。

谢谢你的帮助!

4

3 回答 3

1

您必须在单独的线程中启动长时间运行的操作,例如使用 TPL 并立即返回视图:

public ActionResult StartLongRunningAction() {
    Task.Factory.StartNew( () => {

        // code your long running action here or call a method
    });
    return View();
}

要将进度消息发送给您的客户,我建议您使用像SignalR这样的框架。

于 2013-07-12T10:49:21.253 回答
1

只需使用 ajax 即可获取操作信息。jQuery 可以帮助您简化 ajax 代码。

于 2013-07-12T11:09:15.573 回答
0

我会使用单独的线程在服务器上运行长时间运行的操作,并且我会每 N 秒向服务器发出Ajax请求以获取操作状态。

您还可以考虑 WebSockets/SignalR。但并非所有浏览器都支持这项技术。NuGet 上有一些用于 SignalR 实现的库。http://nuget.org/packages?q=signalr

我建议您查看此视频http://www.asp.net/signalr/videos/getting-started/signalr-and-web-sockets

如果您需要更快的解决方案,您可以像这样更新视图:

<p>@Model.OperationState</p>

@if (Model.OperationIsInProgress){
<script>
   setTimeout("location.reload(true);", 10000);
<script>
}

但这不是异步方法。这个 js 每 10 秒重新加载一次页面。

要启动新线程,您可以使用简单的 System.Threading 类:

using System.Threading;

var thread = new Thread(() => {
    //Call your long running operation here
});
thread.Start();
于 2013-07-12T10:39:06.793 回答