怎么样结束等待中的线程。当我执行EndThread()时,线程还在等待中,引发异常,有什么方法可以结束等待中的线程吗
Thread th;
private void ThreadTask()
{
 th=new Thread(new ParameterizedThreadStart(ThreadTime));
 th.IsBackground =true;
 th.start();
}
private void ThreadTime()
{
 Thread.Sleep(10000000);
 //调用执行任务方法...
}
private void EndThread()
{
  if(th!=null)
{
  th.Abort();
}
}

解决方案 »

  1.   

    强制结束子线程的方式并不好,如果子线程里面有循环的话,可以设置一个_IsQuit标记,循环发现该标记即退出,子线程也就结束了。
    另外,子线程有延时处理最好用ManuResetEvent.waitOne(2000),而不用thread.sleep(),这样通知子线程结束时可以  
    public void QuitSonThread()
    {
       _IsQuit=true;
       _WaitEvent.Set();
    }
     这样就不用无效的等待了。
     最后,结束线程时最好主线程用 Sonthread.Join()等待其完全结束了在座后续操作。
      

  2.   

    private void EndThread()
    {
        th.Join();
    }用 th.Join 等待线程,这是死等。如果Thread不结束,Join会始终阻塞当前线程。
    比较好的做法是,设置一个退出flag,在Thread里自己判断是否需要退出,
    然后外部用 Join(timeout) 等待一个超时时间(单位ms)不过为了能随时停止,那么Thread不应该一口气执行那么长时间,比如:
    Thread.Sleep(10000000);而应该拆开来,比如每执行1000ms 看看外部是否要求停止:int count = 10000;
    while(!needStop && count > 0)
    {
        Thread.Sleep(1000);
        count--;
    }外部只要控制 needStop = true 就能立刻退出。
      

  3.   

    etudiant6666 ,我刚测试了下,设个布尔标记,当我点击按钮触发EndThread()事件时,布尔值为false.还是会引发异常.
    在Thread.Sleep(10000000);代码处引发异常.
    能给一份完整结束挂起进程的代码吗.希望是测试通过的.谢谢!
      

  4.   

    非常感谢fangxinggood 的思路.问题已解决.~~~
      

  5.   

    Thread.Joint(waittime),到处加定时的方式是自欺欺人,子线程实际上未结束,你却不管了,那就是BUG,在调试阶段,如果发现结束时死菜了,那高兴还来不及呢,找到了BUG就知道怎么解决了。一般来说,只有在对你控制不了的线程(如外部进程)才会使用waittime,其他都要join到主线程,其效果就是主线程最后关闭,而不是未知的子线程一直死在系统中。对于LZ, 我已经建议你别用在Thread.Sleep(),但你异常的问题不是处在这里,应该是外部强制关线程抛出的异常。所以我怀疑你根本就没有解决问题。发出QuitSonThread()信号的是主线程,即private void EndThread()
    {
      //主线程
      if(th!=null)
      {
        QuitSonThread();
        th.Join();
        //  th.Abort();  //xxx不要
      }
    }//...
    private void ThreadTime()
    {
      if( !_WaitEvent.WaitOne(10000000))  //如果等到了set信号,说明是主线程强制结束
      {
      //调用执行任务方法...
      }
    }