ASP.NET MVC 4异步控制器回调

我正在使用MVC 4中新的Async Controllerfunction,如下所述http://www.asp.net/mvc/tutorials/mvc-4/using-asynchronous-methods-in-aspnet-mvc-4

如果我的操作可能需要10-20秒才能运行,我想提供某种状态栏来通知用户进度。 Asyncfunction有什么可以帮助解决这个问题吗?

编辑:我将尝试如何尝试并看看是否有更好的方法

public async Task GizmosAsync() { return View("Gizmos", await GetGizmosAsync()); } private void GetGizmosAsync() { for(int i=0; i<10; i++) { lock(_locker) { _statusMessage = String.Format("{0} of 10", i); } DoSomethingLongRunning(); } } public ActionResult Status() { return Json(new { Status = _statusMessage }); } static readonly object _locker = new object(); static string _statusMessage = ""; ....  setTimeout(displayStatus, 1000); function displayStatus() { $.post("/controller/status", function(data) { alert(data.Status); }); }  

异步控制器只是一种从IIS中的ThreadPool释放线程的机制,以便能够在繁重负载期间处理传入请求,但与客户端的通信仍然是通常的请求 – 响应。

状态栏和排序通常只是javascript在屏幕上显示某些内容,直到ajax请求完成。 我不认为MVC4会对那部分有帮助。

您可以执行以下操作: https :

在ajax调用期间显示“正在处理…”

编辑 :如果您需要真正的客户端进度和交互(例如实际进度),您应该查看SignalR http://www.hanselman.com/blog/AsynchronousScalableWebApplicationsWithRealtimePersistentLongrunningConnectionsWithSignalR.aspx和这个相关的post: 异步控制器(MVC),长时间运行进程“停止”

这篇文章似乎描述了你想要的:

ASP.NET MVC 3:用于长时间运行任务的异步jQuery进度指示器

控制器:

 public class HomeController : Controller { private static IDictionary tasks = new Dictionary(); public ActionResult Index() { return View(); } public ActionResult Start() { var taskId = Guid.NewGuid(); tasks.Add(taskId, 0); Task.Factory.StartNew(() => { for (var i = 0; i <= 100; i++) { tasks[taskId] = i; // update task progress Thread.Sleep(50); // simulate long running operation } tasks.Remove(taskId); }); return Json(taskId); } public ActionResult Progress(Guid id) { return Json(tasks.Keys.Contains(id) ? tasks[id] : 100); } } 

视图: