public static System.Threading.Thread trd;//定义线程
private void Button2_Click(object sender, System.EventArgs e)//启动线程
{
trd = new System.Threading.Thread(new 
System.Threading.ThreadStart(this.ThreadTask));
trd.IsBackground = true;
trd.Start();
}
private void ThreadTask()//执行程序
{
for (i = 0; i<=100000;i++)
{
System.Threading.Thread.Sleep(10);
this.Page.RegisterStartupScript
("aa","<script language=javascript>SetPorgressBar("+ i.ToString() 
+");</script>") ;
}
}
private void Button3_Click(object sender, System.EventArgs e)//挂起线程
{
trd.Suspend();
}
<DIV id="Msg1">fdsafdsa</DIV>//网页上用来显示的DIV
网页脚本
function SetPorgressBar(i)
{
WriteText("Msg1",i);
}
function WriteText(id, str)
{
var strTag = '<font face="Verdana, Arial, Helvetica" size="2" color="#ea9b02"><B>' + str + '</B></font>';    
if (document.all) document.all[id].innerHTML = strTag;
}
现在是启动线程后,在网页上面,DIV msg1上面根本就不显示循环变量里面i的值

解决方案 »

  1.   

    zhchg6666() 
    不懂你的意思我的意思:i的值,要实时地显示在网页上面FOR循环里面,i的值,要实时显示在网页上面,,
    每循环一次,就改变一次
      

  2.   

    System.Threading.Thread.Sleep(10);
    10毫秒 感觉不出来 把10 改成1000
      

  3.   

    不要把winform的模式直接用在webform上,这是2个不同的东西,你好像你的Button3_Click中trd.Suspend();是根本没用的,因为在trd在Button3_Click会为null(没初始化),webform是不会保存状态的,所以在Button2new的trd,到了Button3_Click又变成null了
      

  4.   

    这到底错在哪儿?我如果把,this.Page.RegisterStartupScript
    ("aa","<script language=javascript>SetPorgressBar("+ i.ToString() 
    +");</script>") ;单独放在一个按钮事件里面,就可以执行,放在线程里面就没有反应了,,而且加上FOR循环也没有反应了,
      

  5.   

    不是感觉不出来.是根本就没有显示
    这样一定不行的,ASP.NET是客户发出请求服务器应答。
    不支持服务器想客户端要求更改的,要是能的话世界大乱。
      

  6.   

    多线程好像不可以用在ASP.NET中
    服务器不让这样
      

  7.   

    BearRui(AK-47) 
    怎么会没有用呢?我打印i的值,我现在点.Button3_Click 挂起线程,,i的值就不会改变了,这说明,Button3_Click 挂起线程,是有用的,,
      

  8.   

    我的目的:i的值,要实时地显示在网页上面FOR循环里面,i的值,要实时显示在网页上面,,
    每循环一次,就改变一次
      

  9.   

    我觉得BearRui说得对,从原理上来说aspx的页面是提交到server才能处理的,处理完的结果要回来给浏览器。
      

  10.   

    BearRui(AK-47) 
    i在执行线程里面是显示不出来.你看我挂起线程的代码
    trd.Suspend();
    this.Page.RegisterStartupScript("aa","<script language=javascript>SetPorgressBar("+ i.ToString() +");</script>") ;
      

  11.   

    trd.Suspend();
    this.Page.RegisterStartupScript("aa","<script language=javascript>SetPorgressBar("+ i.ToString() +");</script>") ;ASP.NET是不会保存状态了,所以你的i在这里也恢复到了原来的值,i不会保存原来的值,所以你觉的i是停止了的原因吧。
      

  12.   

    ASP.NET是不会保存状态了,所以你的i在这里也恢复到了原来的值,i不会保存你线程中循环的的值,所以你觉的i是停止了的原因吧。
      

  13.   

    System.Threading.Thread.Sleep(10);
    线程中的这个延时,我可以写成,1000,也就是,1秒钟执行一次循环,基本上,我根据时间,然后挂起线程,来得到i的值,也可以对上,而且我挂起后,i的值就不会再改变了,一值是这个,
      

  14.   

    其实你这样的完全可以使用javascript来实现,javascript有2个函数可以达到你的效果window.setTimeout
    window.setInterval
      

  15.   

    BearRui(AK-47) 
    这两个函数,可以拿按钮来实现吗?我是想让他开始就开始,想让他停止就停止,
      

  16.   

    页面不postback(回传)服务器,下面这句代码等于没有执行,只有postback回去了,执行这个,才会输出JS代码到页面上。this.Page.RegisterStartupScript
    ("aa","<script language=javascript>SetPorgressBar("+ i.ToString()
    +");</script>") ;
      

  17.   

    BearRui(AK-47) 
    对,现在就是这样的,,,
      

  18.   

    按小弟的看法,你所用的Thread是没用的。回顾一下aspx是如何实现从请求开始到看到界面的过程的。首先,用户点击按钮,发送请求,服务器接收到请求以后,调用aspx的解析程序,来加载你的aspx程序。解析程序按照你的要求,在服务器建立了一个线程,并且开始运行。然后这个过程就结束了,将结果页面传送回客户端,然后等待用户下一次请求。这里,你的程序是在服务端解析的,同时线程也是在服务端开启。由于B/S结构的程序,都是由客户端主动发起连接的,一旦服务端完成了请求任务,返回了所有内容,也就释放客户端。如果要实现客户端的特效,应该使用JavaScript来做。