2010-03-27 31 views

回答

6

這不是一個線程問題,而是一個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