BufferOutput屬性用於擷取或設定一個值,該值指示是否緩衝輸出並在處理完整個頁之後發送它。該屬性預設值是true,因此我們通常的頁面中的輸出內容都是在頁面處理完成之後才發送給用戶端由瀏覽器呈現出來。如果頁面要處理的內容很多,可能很長時間才能看到頁面上的內容。這個時候有兩種方法可以讓資訊逐步顯示,這樣就能知道當前程式運行到哪一步了。
方法1:BufferOutput預設值為true,這個時候可以藉助Flush方法和Clear方法將當前緩衝區的資訊輸出。這個方法比較通用,當你的頁面在處理一個複雜的程式的時候,可以即時輸出一些提示資訊。
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 if (!IsPostBack)
4 {
5 ShowInfo("中", 100);
6 Response.Flush();
7 Response.Clear();
8 Thread.Sleep(1000);
9
10 ShowInfo("國", 5);
11 Response.Flush();
12 Response.Clear();
13 Thread.Sleep(1000);
14 }
15 }
16
17 private void ShowInfo(string it, int count)
18 {
19 StringBuilder sb = new StringBuilder();
20 for (int i = 0; i < count; i++)
21 {
22 sb.Append(it);
23 }
24 sb.Append("<br/>");
25 Response.Write(sb.ToString());
26 }
方法2:把BufferOutput值設為false,這個時候緩衝區的內容會立即發送給用戶端顯示。這種方法有效能問題,因為沒有使用緩衝輸出,不過代碼簡潔一些。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Response.BufferOutput = false;
ShowInfo("中", 100);
Thread.Sleep(1000);
ShowInfo("國", 5);
Thread.Sleep(1000);
}
}
private void ShowInfo(string it, int count)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++)
{
sb.Append(it);
}
sb.Append("<br/>");
Response.Write(sb.ToString());
}
在使用的時候有兩個問題需要注意:
一是IE瀏覽器在緩衝區資料不少於256位元組的情況下才會輸出到用戶端,經測試FF瀏覽器沒有這個問題。
二是UFT8編碼的漢字一般佔三個位元組(Unicode編碼是兩個位元組),這裡第一次輸出100個漢字是為了保證至少有256個位元組的資料。