我写个UDP的聊天程序,都可以运行,但是关闭后,进程还在,不知道如何才能在,任务管理器中把进程关掉啊, th.Abort();运行,但好象不好使。请大家帮帮忙,问题解决马上给分。using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Net;
using System.Threading;namespace point_talk_to_face
{
    public partial class Form1 : Form
    {
      
        public Form1()
        {
            InitializeComponent();
        }
        private Thread th;
        private void textBox2_TextChanged(object sender, EventArgs e)
        {        }        private void Form1_Load(object sender, EventArgs e)
        {
        //  new Thread(this.Listen).Start() ;
           System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 
           th = new Thread(new ThreadStart(Listen));
           th.Start();
        }        private void button1_Click(object sender, EventArgs e)
        {
                UdpClient udpclient1 = new UdpClient(textBox3.Text,9999);
                Byte[] data = Encoding.ASCII.GetBytes(textBox2.Text);
                udpclient1.Send(data, data.Length);
                textBox1.AppendText("我对"+textBox3.Text+"说:"+textBox2.Text+"\n");
                udpclient1.Close();
        }
        private void Listen()
        {
            UdpClient udp = new UdpClient(9999);
            IPEndPoint remoteiep = new IPEndPoint(IPAddress.Any, 9999);            while (true)
            {
                try
                {
                    Byte[] data = udp.Receive(ref remoteiep);                    if (data.Length > 0)
                    {
                        string word = Encoding.ASCII.GetString(data);
                        label1.Text = remoteiep.Address.ToString();
                        label2.Text = remoteiep.Port.ToString();
                        textBox1.AppendText(label1.Text + "对我说:" + word.ToString() + "\n");
                    }
                    else
                    {
                        
                    }
                }
                catch (Exception ex)
                {
                    textBox1.AppendText(ex.Message);
                }
                udp.Close();
            }
        }        private void textBox1_TextChanged(object sender, EventArgs e)
        {        }        private void close(object sender, FormClosingEventArgs e)
        {
            
        }        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
        /*    l = false;
            th.Abort();
            Application.Exit();*/
          
            Application.Exit();
            th.Abort();
                   }
    }
}

解决方案 »

  1.   

    最好不要放在 FormClosed里面
    而放在 FormClosing里面代码这样写
    try
    {
        if(th!=null)
    th.Abort()
    }
    catch{}
      

  2.   

    原因:
    线程中
    Byte[] data = udp.Receive(ref remoteiep); 
    处于等待状态,也就是所谓的阻塞,必须让其结束才能真正结束线程方法:
     private void Listen() 
            { 
                UdpClient udp = new UdpClient(9999); 
    把这个局部变量UdpClient udp 变成全局变量,
    然后在关闭的时候把它udp.close
    以上。
      

  3.   

    你加个flag吧
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net.Sockets;
    using System.Net;
    using System.Threading;namespace point_talk_to_face
    {
        public partial class Form1 : Form
        private bool recieve = false;
         
            public Form1()
            {
                InitializeComponent();
            }
            private Thread th;
            private void textBox2_TextChanged(object sender, EventArgs e)
            {        }        private void Form1_Load(object sender, EventArgs e)
            {
            //  new Thread(this.Listen).Start() ;
              System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
              th = new Thread(new ThreadStart(Listen));
    recieve = true;
              th.Start();
            }        private void button1_Click(object sender, EventArgs e)
            {
                    UdpClient udpclient1 = new UdpClient(textBox3.Text,9999);
                    Byte[] data = Encoding.ASCII.GetBytes(textBox2.Text);
                    udpclient1.Send(data, data.Length);
                    textBox1.AppendText("我对"+textBox3.Text+"说:"+textBox2.Text+"\n");
                    udpclient1.Close();
            }
            private void Listen()
            {
                UdpClient udp = new UdpClient(9999);
                IPEndPoint remoteiep = new IPEndPoint(IPAddress.Any, 9999);            while (recieve)
                {
                    try
                    {
                        Byte[] data = udp.Receive(ref remoteiep);                    if (data.Length > 0)
                        {
                            string word = Encoding.ASCII.GetString(data);
                            label1.Text = remoteiep.Address.ToString();
                            label2.Text = remoteiep.Port.ToString();
                            textBox1.AppendText(label1.Text + "对我说:" + word.ToString() + "\n");
                        }
                        else
                        {
                           
                        }
                    }
                    catch (Exception ex)
                    {
                        textBox1.AppendText(ex.Message);
                    }
                    udp.Close();
                }
            }        private void textBox1_TextChanged(object sender, EventArgs e)
            {        }        private void close(object sender, FormClosingEventArgs e)
            {
               
            }        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
            /*    l = false;
                th.Abort();
                Application.Exit();*/
             recieve = false;
                Application.Exit();
                th.Abort();
                      }
        }

    这样就能终止了。
      

  4.   

    UdpClient  ,启动线程定义成公共的
    在窗体Closing事件   UdpClient  启动线程 关闭