UdpClient uclient;
        Int32 port = 2008;
        Thread thread;
        public Server()
        {
            InitializeComponent();
            uclient = new UdpClient(port);
            thread = new Thread(new ThreadStart(StartListen));
            thread.Start();
        }
        private void StartListen()
        {
            do
            {
                try
                {
                    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
                    Byte[] buffer = uclient.Receive(ref endPoint);
                    Console.WriteLine(Encoding.ASCII.GetString(buffer));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.ToString());
                }
            } while (true);
        }        private void button2_Click(object sender, EventArgs e)
        {
            thread.Abort();
        }
当按按钮button2的时候,线程仍无法终止。请问,应该怎么才能终止thread...

解决方案 »

  1.   

    thread没有kill的方法啊,kill好象是终止进程的吧?
    有大虾帮忙回答下吧。在线等。
      

  2.   

    自己试了下,有个方法,先贴出来。
            private void button2_Click(object sender, EventArgs e)
            {
                thread.Abort();
                client = new UdpClient("192.168.0.128", 2008);
                Byte[] buffer = Encoding.ASCII.GetBytes("hello,i am sent by udp!");
                client.Send(buffer, buffer.Length);
                Console.WriteLine(thread.IsAlive);
            }
    这样就可以触发异常。然后退出线程了。
    我想一开始没有退出线程是因为程序执行到 Byte[]   buffer   =   uclient.Receive(ref   endPoint); 停在这了。
    由于没有收到信息,就一直停在这。
    可是觉得这个方法不好,虽然勉强解决了。但我看其他的程序也不是这么用的
      

  3.   

    线程.abort() 
    线程.join()
      

  4.   

    托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中   .exe   文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置   Thread.IsBackground   属性,可以将一个线程指定为后台线程或前台线程。例如,通过将   Thread.IsBackground   设置为   true,就可以将线程指定为后台线程。同样,通过将   IsBackground   设置为   false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的   Thread   对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将   Thread.IsBackground   设置为   true,以便进程可以终止。   
        
            一个线程或者是后台线程或者是前台线程。后台线程与前台线程类似,区别是后台线程不会阻止进程终止。一旦属于某一进程的所有前台线程都终止,公共语言运行库就会通过对任何仍然处于活动状态的后台线程调用   Abort   来结束该进程。
    设置为后台线程
      

  5.   

    to jlbaowei  thread.abort();thread.join();这么写,点完button2,程序就死了。。
    to lc328  把thread.IsBackground=true,这样是在程序结束后,可以退出线程。但是当点button2的时候,线程仍不能退出。
      

  6.   

    if(thread.IsAlive)
    {
    thread.abort();
    }