运行长时间运行时显示进度?

时间:2010-12-26 17:12:18

标签: asp.net-mvc-2 asp.net-ajax asp.net-mvc-3

在我的ASP.NET MVC3项目中,我有一个运行一段时间的动作。 如果可以将部分响应发送回视图,那就太好了。 目标是向用户显示一些进度信息。 有人知道如何做到这一点吗?

我尝试了一些直接输出到响应,但它没有被部分地发送到客户端,而是在一个块上:

[HttpPost]
public string DoTimeConsumingThings(int someId)
{
   for (int i = 0; i < 10; i++)
   {
      this.Response.Write(i.ToString());
      this.Response.Flush();
      Thread.Sleep(500); // Simulate time-consuming action
   }
   return "Done";
}

在视图中:

@Ajax.ActionLink("TestLink", "Create", new AjaxOptions() 
  { HttpMethod = "POST", UpdateTargetId="ProgressTarget" })<br />

<div id="ProgressTarget"></div>

任何人都可以帮助我制作渐进式动作效果吗? 谢谢!

1 个答案:

答案 0 :(得分:4)

以下是如何实现这一点:首先定义一个将保持长时间运行状态的类 - &gt;你将需要id,progress,result等属性......然后你将需要两个控制器动作:一个将启动任务,另一个将返回进度。 Start操作将生成一个新线程来执行长时间运行的操作并立即返回。一旦任务启动,您可以将此操作的状态存储到某个公共存储中,例如给定任务ID的应用程序。

第二个控制器操作将传递任务ID,它将查询应用程序以获取给定任务的进度。在此期间,后台线程将执行,并且每次进行时它将更新应用程序中任务的进度。

最后一部分是客户端:您可以使用AJAX定期轮询进度控制器操作并更新进度。