Thread thread=new Thread (new ThreadStart(gc));
thread.IsBackground = true; thread.Start();

解决方案 »

  1.   

    你的子线程没有关闭在主窗体关闭事件中加入:
    thread.Abort();
      

  2.   

    UdpB.Receive是一个阻塞函数,所以你退出时候先UdpB.Close();
      

  3.   

    Abort()方法只是引发线程的一个exception,有时不能终止线程,我建议,使用Command变量:
    private bool _bCommand
    private void button1_Click(object sender, System.EventArgs e)
    {
        Thread thread=new Thread (new ThreadStart(gc));
        _bCommand=true;
        thread.Start();
    }public void gc()
    {
    UdpClient UdpB=new UdpClient(8888);
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5);
    while(_bCommand)
    {
    byte[] receiveBytes=UdpB.Receive(ref RemoteIpEndPoint);
    string receiveMessage=Encoding.ASCII.GetString(receiveBytes);
    richTextBox1.AppendText("<-A "+DateTime.Now+":\r\n"+receiveMessage+"\r\n");
    }
    }如果要停止线程,就_bCommand=false
      

  4.   

    因为UdpB是阻塞的,所以设置标志是没有用的。
    一个办法是你用特定的数据串表示退出。然后你在退出时发出一个包。然后修改:
    public void gc()
    {
    UdpClient UdpB=new UdpClient(8888);
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5);
    while(_bCommand)
    {
    byte[] receiveBytes=UdpB.Receive(ref RemoteIpEndPoint);
    string receiveMessage=Encoding.ASCII.GetString(receiveBytes); if (CheckExit(receiveMessage) == true) break;
    richTextBox1.AppendText("<-A "+DateTime.Now+":\r\n"+receiveMessage+"\r\n");
    }
    }