【问题标题】:Display progress when running long operation?长时间运行时显示进度?
【发布时间】:2011-05-30 21:34:26
【问题描述】:

在我的 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>

谁能帮我做出渐进的行动结果? 谢谢!!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨达林,感谢您的快速回答!你能提出一个如何进行定期AJAX轮询的建议吗?这无疑是这项任务中最重要的一点。
    • @Sascha,你可以使用window.setInterval函数定期执行一些js代码。如果您使用 jquery,则可以使用 $.ajax() 方法发送 ajax 请求。言外之意:window.setInterval(function() { $.ajax(...); }, 5000);