应用需要,想用c#想实现一个简单的窗体,通过按钮触发事件发送数据,然后将从java客户端接收到的数据显示在窗体的richtextbox 中,能正常接受数据,一旦循环接受数据显示时,整个窗体就处于死机状态。????不知道怎么解决这个问题?  public partial class Form1 : Form
    {
        private Socket client = null;
        delegate void ThreadMethod(object obj);
        ThreadMethod _tm = null;        private void Form1_Load(object sender, EventArgs e)
        {
           
        }        private void button1_Click(object sender, EventArgs e)
        {
           
            //程序启动时便与远程进行连接
            client = Connect("192.168.1.55", 9111);
            try
            {
                if (client.Connected)
                {
                    byte[] sends = Encoding.Default.GetBytes(this.textBox1.Text);
                    byte[] byteConvet = new byte[23];
                    byteConvet[0] = 0;
                    byteConvet[1] = 0x15;
                    for (int i = 2; i < 23; i++) {
                        byteConvet[i] = sends[i - 2];
                    }
                    client.Send(byteConvet);
                    string recvStr="";                     byte[] recvBytes=new byte[1024]; 
                    int bytes=0; 
 
                    while(true) {
                        bytes = client.Receive(recvBytes, recvBytes.Length, 0); 
                        //将读取的字节数转换为字符串 
                        recvStr += Encoding.UTF8.GetString(recvBytes, 2, bytes-2);
                        _tm = Show;
                        _tm(recvStr);
                    } 
                }
            }
            catch  {
            }
        }
        private Socket Connect(string ip, int port)
        {
            IPAddress ipa = IPAddress.Parse(ip);
            IPEndPoint ipe = new IPEndPoint(ipa, port);
            Socket sender = new Socket(
                AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                sender.Connect(ipe);
            }
            catch
            {
                return null;
            }
            return sender;
        }
        private void Show(object obj)
        {
            if (!this.richTextBox1.InvokeRequired)
            {
                this.richTextBox1.Invoke(new EventHandler(ControlDelegate),
                    new object[] { obj, EventArgs.Empty });
            }
        }
        private void ControlDelegate(object sender, EventArgs e)
        {
            this.richTextBox1.Text = sender.ToString();
        }
        public Form1()
        {
            InitializeComponent();
        }    }
感觉问题的所在就在while 循环的地方,socket线程一直在占用主窗体的线程。请教解决办法。

解决方案 »

  1.   

    多线程或者是异步
    我最近也在做SOCKET的东东
    可以交流下
      

  2.   

    把button1_Click这事件中的方法独立出来,然后线程启动 
      

  3.   

     while(true) {
                            bytes = client.Receive(recvBytes, recvBytes.Length, 0); 
                            //将读取的字节数转换为字符串 
                            recvStr += Encoding.UTF8.GetString(recvBytes, 2, bytes-2);
                            _tm = Show;
                            _tm(recvStr);
                        } 
    要么新开一个线程把这个WHILE放进去,要么用client.BeginRecive这个方法