List<Thread> list = new List<Thread>();
 for (int i = 0; i < 8; i++ )
            {
                ParameterizedThreadStart pts = new ParameterizedThreadStart(m);
                Thread t = new Thread(pts);
                list.Add(t);
                t.ApartmentState = ApartmentState.STA;
                t.Start(info);
            }
所有的线程都是传入的同一个方法mprivate void m(object i)
{
   //做一些操作,并且判断当时的情况,如果符合情况,就结束掉所有的线程
   //...
   if(符合情况)
   {
       for (int i = 0; i < list.Count; i++)
                {
                    Thread t = list[i];
                    t.Abort();
                }
    }
}
但是现在不能马上结束掉所有线程。我分析原因是,这个结束线程的操作本身也是在一个线程中,100个线程是执行一会这个,再执行一会那个。所以,可能在本线程中只结束掉了10个,就又去执行其他线程了,很长时间后才能又到这个线程去结束掉剩下的90个,而这次可能又是只结束一部分。有没有方法能够立即结束掉所有的非主线程?

解决方案 »

  1.   

    加个成员变量
    bool m_bIsEnd=false;结束线程时,将 m_bIsEnd改成true,即 m_bIsEnd=true;
    在线程循环里加上一个判断
    private void m(object i)
    {
       //做一些操作,并且判断当时的情况,如果符合情况,就结束掉所有的线程
       //...
       if(符合情况)
       {
           for (int i = 0; i < list.Count; i++)
                    {
                       if(m_bIsEnd)
                           return;
                        Thread t = list[i];
                        t.Abort();
                    }
        }
    }
      

  2.   

    如果你用的是.NET4.0,那么可以用Task来替代Thread,这里有介绍:http://msdn.microsoft.com/ZH-CN/library/vstudio/dd537607.aspx
      

  3.   


    你所说的判断,就是我写出的if(符合情况)。 请问如何区分两个线程是否是同一个线程,有相应的ID吗?
      

  4.   

    多此一举,if(符合情况)就已经是判断了,再添加m_bIsEnd完全没必要。
      

  5.   

    m方法是工作线程的方法,里面的循环是让每一个线程都去结束所有的线程,而且还没有判断目标线程的状态,这个操作看起来感觉混乱。添加一个私有变量private volatile bool _shouldStop;在m方法中发现如果符合条件,则将_shouldStop设置为true。在主线程中用while检查这个值,结束所有的工作线程,主线程挂起,并等待结果。看起来依然很别扭。是这个样子的,一般的做法都是让线程自己停止,而不是通过别的线程调用abort方法,abort方法会强行终止受影响的线程,而不管它是否已完成自己的任务,并且不提供清理资源的机会。
      

  6.   

    你要他干嘛?你明明就已经有个list存储了所有线程了,不需要通过其它标识了啊。还有我2楼的回复看了吗?那个才适合你。