你需要把监听的线程终止,才能完整的退出程序。
语法为:Thread.Abort();

解决方案 »

  1.   

    Thread.Abort()在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。
      

  2.   

    把该线城设置为
    private Thread thread;重写X关闭事件,判断线程是否关闭
    如果没有关闭,手工把它关闭
      

  3.   

    Thread thread=new Thread(new ThreadStart(accp));
    改成private Thread thread了,并添加了代码: private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
    if (thread.IsAlive)  
    {
    thread.Suspend();
    thread.Abort();
    }但是不行啊~~~怎么弄啊?
      

  4.   

    我看了状态,thread.abort()后,thread的状态还是alive,但是abort明明调用了,怎么回事啊?
      

  5.   

    我的问题和你一样,不过我是用tcpListener的,如果在程序退出的时候关闭tcplistener对象就好了,光关闭那个线程没用的,千真万确,我试了无数次了。
    也许你程序退出的时候关闭sock对象就好了
      

  6.   

    to fancyyin(死者):调用sock.close();则在
    private void accp()
    {
    hostEntry=Dns.GetHostByName(hostName);
    IPAddress myIP=hostEntry.AddressList[0];
    MyServer=new IPEndPoint(myIP,2525);
    sock=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
    sock.Bind(MyServer);
    sock.Listen(50);
    while(true)
    {
           【accSock=sock.Accept();】 此处出错!
    if(accSock.Connected)
    {
    richTextBox1.AppendText("client connected!\r\n");
    Thread thread=new Thread(new ThreadStart(round));
    thread.Start();
    }
    }
    }
    提示:未处理的“System.Net.Sockets.SocketException”类型的异常出现在 system.dll 中。其他信息: 一个封锁操作被对 WSACancelBlockingCall 的调用中断。是因为关闭了sock了吧?
      

  7.   

    把线程的isbackground属性设为true。主线程结束,所有这样设置过的线程也跟着结束
      

  8.   

    1,sock.Shutdown(SocketShutdown.Both);
    sock.Close();这是必须的,监听是要明确的进行停止2,你的while(true) 这是一个严重的错误,这就是为什么VB6没有提供线程的原因,你必须对线程机制有所了解才推荐你使用多线程,你那样的死循环打算如何结束?强制about 也会引发异常,这是MS不推荐的。
      

  9.   

    你设定一个关闭的按钮,调用以下代码:(XXXXXX为你的程序名,就是主程序的名)
    Process[]  p = Process.GetProcessesByName("XXXXXX");
    foreach(Process process in p)
    {
    process.Kill();
    }
      

  10.   

    楼上的竟然用Kill(),看来你只是业余写程序,要不然不会使用如此不负责的办法声明全局变量用于结束线程
    private bool isQuit = new bool();
    Thread Deal;
    线程范例
    private void thread_real()
    {
          while(true)
          {
    //do something;
             lock(typeof(bool))
    {
         if (isQuit)
         {
    //此处可以结束sock监听
                      break;
         }
    }
          }
    }
    启动线程
    private void Button2_Click(object sender, System.EventArgs e)
    {
         lock(typeof(bool))
         {
    isQuit = false;
          }
          Deal = new Thread(new ThreadStart(thread_deal));
          Deal.Start();
    }
    结束线程
    private void Button1_Click(object sender, System.EventArgs e)
    {
         lock(typeof(bool))
         {
            isQuit = true;
          }
    }
      

  11.   

    回复人: ArLi2003(阿利 上BJ了,哥们找我玩呀) ( ) 信誉:101  2003-12-08 06:34:00  得分:0 
     
    2,
    你的while(true) 这是一个严重的错误,这就是为什么VB6没有提供线程的原因,你必须对线程机制有所了解才推荐你使用多线程,你那样的死循环打算如何结束?强制about 也会引发异常,这是MS不推荐的。while(true)并不是你所说是严重错误,使用线程很多时候都会这样使用死循环,要不然你怎么能让你的程序能够在无人监视的情况下自动运行,除非人为停止。只要恰当的使用线程同步机制处理就行了  
     
      

  12.   

    回复人: RnfShadow(雨夜飞影) ( ) 信誉:100  2003-12-10 21:24:00  得分:0 process和线程是两个概念,不能混为一谈
      

  13.   

    RnfShadow(雨夜飞影) 的方法可行,但是应该不是“正常”的方法。晚上再试13880079673(CMonkey) 的方法,但是你的似乎还是判断,原来的问题就是知道线程还在,但就是关不了,除了shutdown和close,我前面的方法里还缺什么呢?
    先谢两位!
      

  14.   

    这是不是《C#网络核心编程》那本书里的东东?代码好像有问题,我是说书上的。还是用TCPListener吧,既然MS提供了,就是让用的,不用白搭。
      

  15.   

    请问 lock(typeof(bool))
    是什么意思???
      

  16.   

    楼主偶刚刚试过了,你还是用TcpListener.start()吧,这样的话,只要在结束程序时调用她的close()方法,就能关闭监听线程了:)
    在此特别感谢fancyyin(死者)!!!
      

  17.   

    to mobydick(敌伯威) 好像是的
      

  18.   

    在也遇到过这类问题
    我是用的udpclient建立组播联接
    也是新开始了一个线程
    专门用于接收数据udpclient.Receive(...);接收信息
    可是当receive没有接收到数据时
    它就一直处于接收状态
    在外部结束线程就抛出异常
    要是不结束线程直接关闭udpclient也会抛出异常
    不结束线程的话关闭程序后线程还在运行
    为什么这个receive方法没有时间参数
    哪位高手帮忙解决以下
      

  19.   

    Thread.Abort();Application.Exit();Enviornment.Exit(0);