我们先了解一下BufferOutput属性:
BufferOutput属性用于获取或设置一个值,该值指示是否缓冲输出并在处理完整个页之后发送它。默认值是true,因此我们默认情况下我们的.Net都是全部缓冲完了才在浏览器上显示出来。这样就有可能在我们的页面执行时间很长的情况下页面会一直处于空白状态,让用户以为我们的页面打不开了而关掉浏览器。这时候我们可以让页面执行一部分就显示一部分,好让用户知道我们的页面执行到那一步了。
解决方案一:
BufferOutput默认值为true,我们不改变这个设置值,利用Response.Flush方法和Clear方法将当前缓冲区的信息输出。这个方法比较普遍,也不会很影响性能,当页面在处理一个复杂的程序的时候,可以即时输出一些提示信息。
解释一下用到的两个方法:
Response.Flush() 立即输出缓冲区的数据
Response.Clear() 清空缓冲区的数据
示例:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ShowMessage("你", 150);
Response.Flush();
Response.Clear();
Thread.Sleep(1000);
ShowMessage("好", 150);
Response.Flush();
Response.Clear();
Thread.Sleep(1000);
}
}
private void ShowMessage(string s, int count)
{
StringBuilder str= new StringBuilder();
for (int i = 0; i < count; i++)
{
str.Append(s);
}
Response.Write(str.ToString());
}
解决方案一:
把BufferOutput值设为false,这时间服务器执行一行就发送一行数据到客户端,也就是即时显示信息。但注意,这样会很影响性能,因为这样,数据就没有在服务器缓存了。
示例:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Response.BufferOutput = false;
ShowMessage("你", 150);
Thread.Sleep(1000);
ShowMessage("好", 150);
Thread.Sleep(1000);
}
}
private void ShowMessage(string s, int count)
{
StringBuilder str= new StringBuilder();
for (int i = 0; i < count; i++)
{
str.Append(s);
}
Response.Write(str.ToString());
}
注意:1,即使设置了BufferOutput值设为false,也要在缓冲区数据不少于256字节的情况下才会输出到客户端,经测试FF浏览器没有这个问题。
2,UFT8编码的汉字一般占三个字节(Unicode编码是两个字节),所以我们在上例中循环输出150个字符,而不是50个,因为50个就有可能看不到效果。'