首页 新闻 会员 周边

关于线程退出的问题怎么解决

0
[已解决问题] 解决于 2013-11-15 00:11

SuspendRequested | WaitSleepJoin

th1.ThreadState = Suspended;

原本我是有一个主线程

public partial class Form1 : Form
{

  private Thread th1 = null; //执行后台运转的主线程
  button1_click(...)
  {
     th1 = new Thread(Operate);
     th1.start();
  }

  public void Operate
  {
    while(true)
      {
        ......
        Thread.sleep(10000);
      }
  }

  button2_click(...)
  {
    th1.Suspend();
  }

  Form1_FormClosing(...)
  {
     if (th1.ThreadState.ToString() == "Suspended" )
        {
            th1.Resume();
            th1.Abort();
        }
    else  th1.Abort();

   }
}
            

我在点击了btn1  btn2 之后点击关闭按钮 就出现了这么错误

线程被挂起;正在尝试中止。

据说是因为sleep导致的这个问题  这样要怎么解决?

.F.的主页 .F. | 初学一级 | 园豆:13
提问于:2013-11-08 12:53
< >
分享
最佳答案
0

Suspend()已经不推荐使用了,我做程序时候要么设置公共变量让线程自动执行完,要么直接用try{Abort()}catch{}把线程直接干掉。

奖励园豆:5
贪心狸猫 | 小虾三级 |园豆:872 | 2013-11-09 20:59
其他回答(1)
0

有一种不太完美的解决方案,设置th1.IsBackground = true;  在From_closing中,不用管th1的状态,主窗体退出后,线程也会退出。 说不太完美就是,万一线程在执行任务的话,可能执行一半就退出了。所以你必须能保证线程执行的任务可以中断。

 

针对lz的问题,我的解决办法是, 在Form_closing中,判断th1的状态,并且等待th1的状态为runing时执行abort(), 你遇到的那个异常,估计是当时线程仍旧处于sleep状态,你去终止时产生的异常。

 

cnblogs也整理出了线程的知识库:http://kb.cnblogs.com/page/42528/  你去看看

袁家小黑球 | 园豆:1045 (小虾三级) | 2013-11-09 10:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册