本帖最后由 dongfangshang 于 2012-04-26 02:09:38 编辑

解决方案 »

  1.   

    申明1个线程list 或者在线程内部 当满足指定条件时 自己剖腹自裁
      

  2.   

    最好是Test中的do循环自愿退出,要么调用Thread.Abort,不过这样的话最好在Test中抓异常,释放资源,因为Thread.Abort会在Test中引发异常,
      

  3.   

    多谢楼上两位的回答,能写一个例子么?  例如 想停止 i=0 和 i = 2 的线程,而i=1 继续运行。
      

  4.   

    你把Thread 的对象引用留下来,想怎么玩就怎么玩
      

  5.   


    是用户根据自己的情况,停止特定线程,我声明对象的时候都是 Thread th = new Thread(delegate() { Test(i.ToString()); });
    那我 th.join() 不能单一停止某一个线程吧。
      

  6.   

    要实现的功能是当用户按BUTTON1的时候启动几个线程, 然后当用户按BUTTON2的时候停止部分用户指定的线程。
      

  7.   

                Thread[] threads = new Thread[3];//全局变量
    private void button1_Click(object sender, EventArgs e)
            {
                for ( int i=0;i<threads.Length;i++)
                {
                    threads[i] = new Thread(delegate() { Test(i.ToString()); });
                    threads[i].Start();
                }
            }        void Test(string hwnd)
            {
                do
                {
                    MessageBox.Show(hwnd);
                } while (true);
            }
    //threads[1],threads[2] 该干嘛就干嘛
      

  8.   

    我来完善10L的例子:Thread[] threads = new Thread[3];//全局变量
    private void button1_Click(object sender, EventArgs e)
       {
       for ( int i=0;i<threads.Length;i++)
       {
       threads[i] = new Thread(delegate() { Test(i.ToString()); });
       threads[i].Start();
       }
       }   void Test(string hwnd)
       {
    try
    {
       do
       {
       MessageBox.Show(hwnd);
       } while (true);
    }
    catch(ThreadAbortException e)
    {
       //在这里释放资源
       Thread.ResetAbort();
    }   }
    //这样就可以终止1号线程,
    threads[1].Abort();
      

  9.   

    新建一个类,这个类的字段是你用于控制线程必要字段。
    每个类的对象对应一个线程。
    因为C#中类的对象是引用,所以很方便了,这样吧, 我写个简单点的。
    class A
    {
     public bool breakFlag = false;
     public int thread_Index = -1;
    }
    有一个全局的List<A> lst;
    下面是启动线程:
    for(int i =0 ; i < 3; i ++)
    {
      A a = new A();
      a.thread_Index = i;
      Thread th = new Thread(delegate() { Test(i.ToString()); });
      lst.add(a);
    }
    下面是你的test函数
    void test(string index)
    {
     A a = lst.find(l=>l.thread_Index == int.parse(index));
     if(a == null) throw new exception();
     
     while(true)
     {
      if(a.breakFlag) return;
     }
    }
    如果你需要暂停0这个线程,那么你在其他的地方把0对应的A的对象中的breakFlag设置为true就好了。
    就是这样,如果你需要的是暂停,而不退出,那么在A类中添加一个autoresetEvent对象,使用方式如同breakFlag。如果你想不通为什么外面的lst可以操作线程中的a,那么你好好看看什么是引用,什么是值。
      

  10.   

    哦,上面的代码里面,掉了一句thread的启动start,你自己添加上去吧,在for语句{}之间的最后一行,在add的下面。
    另外我不是很赞同直接操作thread的对象,毕竟让线程自然退出比你在外面使用abort要好很多,而且abort很多时候会出问题的。