我的一些线程需要结束.但是这些线程可能是suspend的.
也可能没有start(),这些线程调用Abort结束的时候回出现异常问题
我该怎么办??怎么才能安全的结束这类线程??

解决方案 »

  1.   

    由于 Thread.Abort 不会使线程立即中止,因此如果需要确保线程被停止,则必须调用 Thread.Join 以在该线程上等待。Join 是一个阻塞调用,该调用直到线程实际停止执行后才会返回。一旦线程被中止,它将无法重新启动。您还可以调用 Thread.Join 并传递超时时间段。如果线程在超时结束之前死亡,该调用将返回 true。否则,如果该时间在线程死亡之前过期,则该调用将返回 false。在对 Thread.Join 的调用上等待的线程可以被调用 Thread.Interrupt 的其他线程中断。一般建议
    使用多线程时要考虑以下准则: 不要使用 Thread.Abort 终止其他线程。对另一个线程调用 Abort 无异于引发此线程的异常,而且将不知道此线程已处理到哪一点。 
    不要使用 Thread.Suspend 和 Thread.Resume 来同步多个线程的活动。不要使用 Mutex, ManualResetEvent、AutoResetEvent 和 Monitor。 
    不要从主程序中控制辅助线程的执行(比如使用事件),而应在设计程序时让辅助线程负责等待任务,执行任务,并在完成时通知程序的其他部分。如果辅助线程不阻塞,请考虑使用线程池线程。Monitor.PulseAll 在辅助线程阻塞的情况下会很有用。 
    一定要确保已进入监视器的线程总离开此监视器,即使当线程在监视器中时发生异常时也是如此。C# 的 lock 语句和 Visual Basic 的 SyncLock 语句可自动提供此行为,它们用一个 finally 块来确保调用 Monitor.Exit。如果无法确保将调用 Exit,请考虑将您的设计更改为使用 Mutex。Mutex 在当前拥有它的线程终止后会自动释放。 
    一定要针对那些需要不同资源的任务使用多线程,避免向单个资源指定多个线程。例如,任何涉及 I/O 的任务都会从拥有其自己的线程这一点得到好处,因为此线程在 I/O 操作期间将阻塞,从而允许其他线程执行。用户输入是另一种可从专用线程获益的资源。在单处理器计算机上,涉及大量计算的任务可与用户输入和涉及 I/O 的任务并存,但多个计算量大的任务将相互竞争。
      

  2.   

    线程只要正确执行完过程内的代码正常退出才算安全
    如果你想控件它们全部正常退出,应该设一下全局变量指示他们退出void ExitAll()
    {
    public bool bExitNow = true;
    thread1.Resume();
    thread1.Join();//同步等它退出//退出了}thread1 的主过程 void thProc()
    {
       while(...)
       {
         if (bExitNow) return; //立马退出
         //处理代码     
       }
    }
      

  3.   

    线程只要正确执行完过程内的代码正常退出才算安全
    如果你想控件它们全部正常退出,应该设一下全局变量指示他们退出public bool bExitNow = true;void ExitAll()
    {
    thread1.Resume();
    thread1.Join();//同步等它退出//退出了}thread1 的主过程 void thProc()
    {
       while(...)
       {
         if (bExitNow) return; //立马退出
         //处理代码     
       }
    }
      

  4.   

    Abor肯定会异常,我是将while的条件设置成false
      

  5.   

    其实,abort确实会有异常.这个我知道.
    主要是这样的.我动态生成一堆线程.每个线程通过一个标志为来设定是否运行还是挂气.
    但是,我的要求是.不管这些线程是运行还是挂气.用户要删除某一个线程.这是挂气的线程就回报错,说该线程挂气.运行的现成可以删除.怎么实现这个动能??不管他是否挂起,直接就删掉某一个线程
      

  6.   

    要先 Join ,再 Abort。
      

  7.   

    所有线程用IsBackgroud = true;采用线程池管理,需要的时候再创建什么状态都不理,关闭应用程序时线程也就没了,不行吗?