如何在ASP.NET中处理数据时更新进度消息?

问题描述:

我有一个过程,输出一步一步的消息(即处理项目1 ...项目2等错误等)。如何在ASP.NET中处理数据时更新进度消息?

我希望在过程中输出给用户,而不是结束。

我很确定我需要使用线程来做到这一点,但找不到一个体面的例子。

这不是一个线程问题,而是一个Web浏览器UI问题。您希望浏览器在您在服务器上工作时呈现状态。从理论上讲,你可以这样做:

Response.Write("something"); 
Response.Flush(); 

Flush()不能确保浏览器实际上是在那一刻呈现你的代码。实际上,您无法控制数据从服务器到浏览器的缓存/分块/缓存方式。所以每个更新应该是一个'完整的'http事务。

其中一种常见的方式是使用AJAX来实现这一点。用户点击一个开始一些后台工作的按钮,并且你有一个javascript计时器轮询(发出请求)以检查工作状态,并更新客户端浏览器。

检查出Real-Time Progress Bar With ASP.NET AJAX用ajax和.net做ajax进度指示器。

有建立在这篇文章中一个HTTP处理程序的进度条的一个很好的例子:http://www.asp101.com/articles/matt/progressbar/default.asp

为了证明我的观点,下面的代码在Firefox,而不是在IE或Chrome:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Response.Buffer = false; 
    Response.Clear(); 
    Response.Write("<html><body>"); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Thread.Sleep(2000); 
    Response.Write("1\n"); 
    Response.Flush(); 
    Response.Write("</body></html>"); 
    Response.End(); 
} 
+0

我已经看到了一种真正整洁的方式,在之前使用线程...只是不记得在哪里,以及如何去做。它基本上启动了一个正在运行的方法,并且每隔一段时间都会显示下一个进度消息。 – Danny 2010-03-27 21:45:53

+0

您的工作将在更新其进度状态的线程上执行。然后你的客户将会调查这个状态。但正如我所提到的,理论上你可以在一个线程中完成工作,并使用Response.Write和Response.Flush写入进度,但不能保证它在整个请求完成之前实际刷新到浏览器并呈现。 – 2010-03-27 22:12:50

+0

我不认为Response.Write在一个线程中起作用。 但是,我看到之前看到的东西又回来了,我认为它可能已经使用AJAX来集中状态客户端。 – Danny 2010-03-27 22:25:53