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

C# 在ASP.NET中处理数据时,如何更新进度消息?,c#,asp.net,multithreading,progress-bar,C#,Asp.net,Multithreading,Progress Bar,我有一个过程,它输出一步一步的消息(即,处理项目1…项目2中的错误等) 我希望这是在过程中输出给用户,而不是在最后 我很确定我需要用线程来实现这一点,但找不到合适的例子。这不是线程问题,而是web浏览器UI问题。您希望浏览器在服务器上工作时呈现状态。理论上,你可以这样做: Response.Write("something"); Response.Flush(); 但是Flush()不能确保浏览器在那一刻实际呈现您的代码。实际上,您无法控制数据从服务器到浏览器的缓存/分块/缓冲方式。因此,每个

我有一个过程,它输出一步一步的消息(即,处理项目1…项目2中的错误等)

我希望这是在过程中输出给用户,而不是在最后


我很确定我需要用线程来实现这一点,但找不到合适的例子。

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

Response.Write("something");
Response.Flush();
但是
Flush()
不能确保浏览器在那一刻实际呈现您的代码。实际上,您无法控制数据从服务器到浏览器的缓存/分块/缓冲方式。因此,每个更新都应该是一个“完整”http事务

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

查看使用ajax和.net执行ajax进度指示器的情况

本文中有一个使用http处理程序创建进度条的极好示例:

为了证明我的观点,以下代码适用于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();
}
受保护的无效页面加载(对象发送方,事件参数e)
{
Response.Buffer=false;
Response.Clear();
回答。写(“”);
响应。写入(“1\n”);
Response.Flush();
《睡眠》(2000年);
响应。写入(“1\n”);
Response.Flush();
《睡眠》(2000年);
响应。写入(“1\n”);
Response.Flush();
《睡眠》(2000年);
响应。写入(“1\n”);
Response.Flush();
回答。写(“”);
Response.End();
}

我以前见过一种使用线程的非常简洁的方法。。。只是不记得在哪里,怎么做。它基本上是启动一个正在运行的方法,每隔一段时间,就会显示下一条进度消息。您的工作将在更新其进度状态的线程上执行。然后你的客户将为州投票。但正如我所提到的,理论上,你可以在线程中启动工作,并用Response.write和Response.Flush编写进度,但你不能保证在整个请求完成之前,它会被刷新到浏览器并呈现出来。我认为Response.write在线程中不起作用。然而,在我之前看到的项目中又出现了一些东西,我认为它可能使用了AJAX来汇集客户端的状态。添加了一个代码示例来展示Flush的使用,并且它不会适用于所有浏览器。因此,在后台线程上启动您的工作,并让客户机轮询状态。当然,如果IIS回收应用程序池,线程可能会死亡,因此对于100%的解决方案,长时间运行的工作应该在IIS之外的某种服务中运行。