在VS2005下开发了一个客户端与服务端通信的程序!
我在客户端程序中使用了多线程!
可是在客户端程序关闭后,仍占用系统部分系统资源!
只有在服务端程序进程终止之后,客户端资源才可以得到释放!
请问是什么原因?
客户端程序代码:
private IPAddress myIP = IPAddress.Parse("192.168.0.1");
private IPEndPoint MyServer;
private Socket sock;
private bool bb = true;public string recvStr = "";  //接收到字符串public Thread thread;private void btnCon_Click(object sender, EventArgs e)
{
     MyServer = new IPEndPoint(myIP, Int32.Parse("8888"));
     sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     sock.Connect(MyServer);     this.statusBar1.Text = "与主机连接成功!";     thread = new Thread(new ThreadStart(targett));
     // thread.IsBackground = true;
     thread.Start();
}
public delegate void MyOkInVoke(string str);private void targett()
{
   while (bb)
   {
      Byte[] bbb = new Byte[1024];
      string aa = "";
      int bytes;
      bytes = sock.Receive(bbb, bbb.Length, 0);
      aa += System.Text.Encoding.Default.GetString(bbb, 0, bytes);      recvStr  = recvStr+aa;
      //传递参数
      MyOkInVoke okCon = new MyOkInVoke(CreateNewForm);
      this.BeginInvoke(okCon, new object[] { recvStr });
   }     
}        
public void CreateNewForm(string str)
{
     this.txtRecv.Text = recvStr; //刷新接收数据文本框
     this.txtRecv.Update();
}private void btnSend_Click(object sender, EventArgs e)//发送数据
{
    Byte[] bytee = new Byte[1024];
    string send = this.txtSend.Text.ToString();
    bytee = System.Text.Encoding.Default.GetBytes(send.ToCharArray());
    sock.Send(bytee, bytee.Length, 0);
}
private void btnClose_Click(object sender, EventArgs e)//关闭连接中断线程
{
    try
    {
       sock.Close();
       thread.Abort();       this.statusBar1.Text = "与服务器断开连接!";
    }
   catch { MessageBox.Show("连接尚未建立,断开无效!"); }
}

解决方案 »

  1.   

    退出时 bb=false;
      
    *****************************************************************************
    欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html
      

  2.   

    while (bb)
       {
          Byte[] bbb = new Byte[1024];
          string aa = "";
          int bytes;
          bytes = sock.Receive(bbb, bbb.Length, 0);
          aa += System.Text.Encoding.Default.GetString(bbb, 0, bytes);      recvStr  = recvStr+aa;
          //传递参数
          MyOkInVoke okCon = new MyOkInVoke(CreateNewForm);
          this.BeginInvoke(okCon, new object[] { recvStr });
       } 问题在这,因为你的程序和此线程是并行的,所以程序退出后,此程序并没有结束.一般方法是,程序退出前要向server发退出命令,server回一个确认后,把bb=false;就可以正常退出了。