线程1 th1 用来更新窗体上一个label 的text
th1=new thread(new threadstart(UpdateLable));
主线程(窗体线程)
 while(true)
 {
  th1.start();
  while(!th1.IsAlive);
  DO SOMETHING
}
void UpdateLabel()

  while(true)
  label1.Text=value1.tostring();
}但是窗体 上的Label1的text并没有更新,虽然value1在不断发生变化

解决方案 »

  1.   

    线程1 th1 用来更新窗体上一个label 的text
    th1=new thread(new threadstart(UpdateLable));
    主线程(窗体线程)
     while(true)
     {
      th1.start();
      while(!th1.IsAlive);
      DO SOMETHING
    }
    void UpdateLabel()

      while(true)
      label1.Text=value1.tostring();
      label1.Refresh();  //此处加个刷新
    }
      

  2.   

    但是问题好像是 要等  
     while(true)
     {
      th1.start();
      while(!th1.IsAlive);
      DO SOMETHING
    }加了label1.Refresh();  //此处加个刷新
    循环结束后,th1 才能开始得到执行,这是为什么?
      

  3.   

    void UpdateLabel()

      while(true)
    {
      label1.Text=value1.tostring();
      label1.Refresh();  //此处加个刷新
    }
    }修改一下解决。少一个括号。呵呵~~~
      

  4.   

    不过你这样做会占用很多系统资源,用线程通讯比较好。多线程实际上有两种做法,一个是自己开一个线程自己管理,另外一个是用异步的委托代理。你用第一种,我帮你改一下private static ManualResetEvent allDone = new ManualResetEvent(false);主线程(窗体线程)
     while(true)
     {
    allDone.Reset();
      th1.start();
      //while(!th1.IsAlive);
    allDone.Wait(); // 挂起,等待子线程结束
      DO SOMETHING
    }void UpdateLabel()

      while(true)
    {
      label1.Text=value1.tostring();
      label1.Refresh();  //此处加个刷新
    }
    allDone.Set(); // 通知主线程继续运行
    }
      

  5.   

    不好意思,看错了,你用的是while(!th1.IsAlive);那么子线程应该改如下void UpdateLabel()

    allDone.Set(); // 子线程开始,通知主线程继续运行
      while(true)
    {
      label1.Text=value1.tostring();
      label1.Refresh();  //此处加个刷新
    }
    }
      

  6.   

    谢谢楼上几位提供的方法 我是了下 还是不好用
    我的需求是这样的
    在窗体上有个label 它用来即时显示正在处理文本文件中的第 几条记录,
    主线程main 函数读取 每次读取 文本一行并处理
      

  7.   

    to 碧海蓝天
    如果我在 主线程(窗体线程)加一个MessageBox。show();
    则 th1 就能得到执行
     while(true)
     {
      th1.start();
      while(!th1.IsAlive);
      DO SOMETHING
      MessageBox.show();// 后加德  不知道为什么?
    }
      

  8.   

    不知为不知,我都是做后台的,几乎没有接触到UI,不是很清楚UI的东西。一般多线程流程应该如此:主线程开始 -> 计数器归0 -> 启动子线程1读取文本 -> 启动子线程2定时刷新界面 -> 主线程结束(这里不结束,界面会卡住)子线程1开始 -> 读取文本 -> 开始循环处理每一条记录
    子线程1循环体 -> 处理记录 -> 处理纪录结束,计数器加1 -> 下一条记录
    循环结束 -> 通知子线程2处理结束 ->子线程2停止子线程2开始 -> 死循环,直到线程1结束
    死循环 -> 读取计数器 -> 刷新Label -> 如果处理结束,则用break跳出循环,否则Thread.Sleep(25) -> 继续循环(这里25毫秒刷1次就可以了,不然系统速度狂降)
    循环结束后 -> 最后一次读取计数器 -> 刷新Label -> 子线程2停止
      

  9.   

    循环结束 -> 通知子线程2处理结束 -> 子线程1停止 // 这里写错,是1停止不是2停止
      

  10.   

    To 碧海蓝天 
    我还是 用了这个private static ManualResetEvent 方法。
    用了两个  ManualResetEvent对象,allDone, MR, allDone负责主线程,MR 负责 刷新Label 的线程。 在主线程里 控制 MR、 在刷新label线程里控制allDone,使两个线程交替执行。
    谢谢你的竭力帮助