如题,每次窗体关闭时都弹出对话框说正在结束线程,应该怎么完美的结束所有子线程呢?
private void frmGetImg_FormClosed(object sender, FormClosedEventArgs e)
        {
            for (int i = 0; i < threadnum; i++)
            {
                if (myThread[i] == null)
                {                }
                else
                {
                       myThread[i].Abort();
                }
            }
}

解决方案 »

  1.   

    在每个myThread[i]线程启动之前,把线程的IsBackground设为true例:
    myThread[i].IsBackground = true;
    myThread[i].Start(); 
      

  2.   

    楼上是一个办法,后台线程会在前台线程退出时自动退出另外一个办法是在主线程中用Thread。Join方法等待子线程退出完毕。
      

  3.   

    我来个暴力的:private void frmGetImg_FormClosed(object sender, FormClosedEventArgs e) 
            { 
                for (int i = 0; i < threadnum; i++) 
                { 
                    if (myThread[i] == null) 
                    {                 } 
                    else 
                    { 
                         try
                          {
                            myThread[i].Abort(); 
                          }
                          catch{;}
                    } 
                } 
    }
      

  4.   

    private void frmGetImg_FormClosed(object sender, FormClosedEventArgs e) 
            { 
                for (int i = 0; i < threadnum; i++) 
                { 
                    if (myThread[i] == null) 
                    {                 } 
                    else 
                    { 
                        try 
                          { 
                            myThread[i].Abort(); 
                          } 
                          catch{;} 
                    } 
                } 
                myThread.Clear();
    }
      

  5.   

    我再来个极其暴力血腥的方法:
    Process.GetCurrentProcess().kill();这样无论程序在干什么都立即退出了。建议这个方法不要随意使用哈。最好还是通过控制线程的运行的标志(比如bool变量),来正常结束线程。必要的时候可以使用join方法。
      

  6.   

    稍改动一下你写的,就比较安全了。处理代码应该放在FormClosing事件中            for (int i = 0; i < threadnum; i++) 
                { 
                    if (myThread[i] != null && myThread[i].IsAlive == true) 
                    { 
                          myThread[i].Abort(); 
                    } 
                } 
      

  7.   

    楼上的还是不行的,Thread.Abort()方法必然抛出一个异常出来,所以,必须放在try/catch块中,否则……
      

  8.   

    不是抛异常,抛异常会中断程序,而这个Abort方法是产生异常,这个异常是正常的,不影响程序运行,是微软允许的,不用作处理。
      

  9.   

    仔细看一下Thread.Abort()方法的msdn,不要画蛇添足。