我有一個過程,輸出一步一步的消息(即處理項目1 ...項目2等錯誤等)。如何在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