如何在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();
}
我已经看到了一种真正整洁的方式,在之前使用线程...只是不记得在哪里,以及如何去做。它基本上启动了一个正在运行的方法,并且每隔一段时间都会显示下一个进度消息。 – Danny 2010-03-27 21:45:53
您的工作将在更新其进度状态的线程上执行。然后你的客户将会调查这个状态。但正如我所提到的,理论上你可以在一个线程中完成工作,并使用Response.Write和Response.Flush写入进度,但不能保证它在整个请求完成之前实际刷新到浏览器并呈现。 – 2010-03-27 22:12:50
我不认为Response.Write在一个线程中起作用。 但是,我看到之前看到的东西又回来了,我认为它可能已经使用AJAX来集中状态客户端。 – Danny 2010-03-27 22:25:53