你终止线程的方法有问题。abort并不能确保终止线程。一般应该从线程函数中主动退出,这样比较安全。线程函数一般为无限循环,可以设置一个标志,当标志为真时跳出循环。
这方面我所知有限,仅供参考。

解决方案 »

  1.   

    我试过了,如果是一个button_Click事件里面写同样的语句,在关闭程序后不会有这种情况,但就是Form1_Closed里面写就会,为什么啊
      

  2.   

    如果不行,试试Thread1.Dispose ( ) ;直接通知内存回收工具回收该线程。
    再利用Application.Exit();退出应用,很直接,但有时会出现随机异常,原因还没去查。
      

  3.   

    Thread类的Abort方法被调用时,线程不会立即停止执行,所以会出现你所说的现象。但当你在button_Click事件里面写同样的语句,在关闭程序后不会有这种情况,是因为线程仍然在执行,不过你不知道罢了。
      

  4.   

    绝对不能不管。
    你必须在线程中主动退出。
    退出方法很多,在没有消息循环的线程中,唯一方法是用标志,如:class abc()
    {
      static bool bIsStopMyThread = false;
      void StartTrhead()
      {
        Thread __thr = new Thread(mythread);
        __thr.Start();    ...
        bIsStopMyThread = true;
        __thr.Abort();    
      }
      void mythread()
      {
        while(!bIsStopMyThread)
        {
          ...
        }
      }
    }
      

  5.   

    好像是tcpListener的问题
    如果有tcpListener.AcceptSocket()程序会在那停住
      

  6.   

    你的问题我遇到过,是因为tcpListener没有关上的原因。
    你要把tcpListener定义为公共的,然后在外部调用Abort后,执行
    tcpListener.close()才可以
    if(onoff==false)
    {
        LisFrm.Port=Int32.Parse(textBox1.Text.Trim()); 
        bool crc=LisFrm.crcdate(); 
        newTherad=new Thread(new ThreadStart(LisFrm.StartListen)); 
        LisFrm.ServerFrm =this;
        newTherad.IsBackground=true; 
        newTherad.Start();
        button1.Text ="停止";
        onoff=true;
    }
    else
    {
        newTherad.Abort();
        LisFrm.serverListener.Stop();  
        newTherad=null;
        button1.Text ="监听";
       onoff=false;
    }
      

  7.   

    你也可以在catch(System.Threading.ThreadAbortException)中执行
    tcpListener.stop()(刚才说错是不是tcpListener.close()而是
    tcpListener.stop()),但有时会不管用,不如上一个方法可靠。
      

  8.   

    谢谢  Muf(沐枫) ,fa2002(叮当) :)