两个线程:td1,td2
td1首先执行且一直循环执行,但是执行td1要消耗大量的时间,td1结束后产生数据文档。
td2要等待td1执行完产生数据文档并调用td1产生的文档
由于td1要消耗大量时间,软件不得不sleep较长时间,这样造成软件界面的假死状态....
请问各位有什么好的办法可以避免这种界面假死状态....有代码示例最好....
感谢各位了

解决方案 »

  1.   

    我是这样干的,除了 UI 线程,
    还要一个控制线程
    一个工作线程控制线程启动工作线程, 根 UI 线程交互, 循环 wait 一个 event 一定时间,
    向 UI 线程报告进度,
    工作线程工作完毕后触发那个 event, 控制线程接收到, 得以结束.
      

  2.   

    delegate void VoidDelegate;
    void doSomething()
    {
       //调用td1
    }
    void btn_clicked(object sender Eventargs e)
    {
       VoidDelegate d = new VoidDelegate(doSomething);
       this.Invoke(d);
    }
    控件就不会假死了.
      

  3.   

    设置一个信号量,,td1 设置信号量,td2 等待信号量。这两个线程都设置为后台线程
      

  4.   

    将有大量操作的线程与UI线程独立开来,UI就不会假死了
      

  5.   

    你把2个工作单独写成2个线程,控件的简单访问把Controls的Check什么什么的属性在Init的时候写称False,或者用Delegate+控件的Invoke去调用,应该是不会UI死住的,除非是你那2个工作,有一个写在了主线程上
      

  6.   

    你这种方式建议产生产生数据文档过程通过BackgroundWorker组件来实现,这样界面响应和文档生成互不影响,
    我在下面的文章中提供了详细的代码实例和实现原理分析。
     使用BackgroundWorker组件进行异步操作编程
    http://blog.csdn.net/zhzuo/archive/2008/07/23/2699305.aspx如果楼主觉得还有更好的处理方式,很高兴交流。
      

  7.   

    这么看. td1占用的肯定是UI线程.td1用一个独立线程处理就ok了.