none
socket 窗体问题 RRS feed

  • 问题

  •     最近做IM,遇到一个问题,当接收到新消息时,打开窗体,窗体就是呈现出反白现象,无法响应,代码如下:

            private void Listen(object obj)                   //接收信息
            {

                while (true)
                {
                    try
                    {
                        byte[] id = new byte[500];
                        int recv1 = _client.Receive(id, id.Length, SocketFlags.None);
                        int recvID = Convert.ToInt32(Encoding.Unicode.GetString(id, 0, recv1));
                        if (recv1 != 0)
                        {
                           
                            foreach(Users user in listener.userList)
                            {
                                if(user.UserID==recvID)
                                  {
                                      byte[] data = new byte[1024 * 4];
                                      int recv2 = _client.Receive(data, data.Length, SocketFlags.None);
                                      string information = Encoding.Unicode.GetString(data, 0, recv2);
                                      string name = user.UserName;
                                      frmMessage frm = new frmMessage();
                                      frm.Text = name;
                                      frm.show();
                                  }
                            }
                        }
                    }
                    catch(Exception)
                    {
                   
                    }
                }
            }

    不知道是什么原因,请教解决方法,在线等..............

    2010年5月14日 3:48

答案

  • 反白出现的原因

    一般是由于form的初始化时间过长 导致form的paint的操作等待很久不能执行 绘制基本的控件

    所以从这个角度出发 你应该去调试下 检查是否有某个方法等待执行的时间特别长

    用socket特别注意的问题是用了某些方法会柱塞当前线程(看起来就像是当前最近的操作一直处于不响应的状态)

    我猜你的代码可能给在这些地方存在问题

    1.    foreach(Users user in listener.userList)

    2.   _client.Receive 由于网络或什么原因 严重柱塞

    3.form的构造函数里面写入了过多复杂的逻辑

    请检查。

    2010年5月17日 7:17

全部回复

  • 你的代码写的很乱

    出现反白现象的是被show的表单还是主表单?

     

    2010年5月14日 4:08
  • 你好!

         尝试用BeginRecieve方法代替Recieve方法,这个方法是非阻塞的,看看能否解决这个问题!


    周雪峰
    • 已建议为答案 mazhou 2010年5月14日 9:31
    2010年5月14日 5:43
    版主
  • 出现反白是被show的表单,不是主表单,还在学习C#呢,代码很乱,见凉
    2010年5月14日 6:52
  • 就是接收到消息后打开窗体,将消息显示出来,就是在打开窗体这里出现的反白现象

    2010年5月14日 7:13
  • 反白出现的原因

    一般是由于form的初始化时间过长 导致form的paint的操作等待很久不能执行 绘制基本的控件

    所以从这个角度出发 你应该去调试下 检查是否有某个方法等待执行的时间特别长

    用socket特别注意的问题是用了某些方法会柱塞当前线程(看起来就像是当前最近的操作一直处于不响应的状态)

    我猜你的代码可能给在这些地方存在问题

    1.    foreach(Users user in listener.userList)

    2.   _client.Receive 由于网络或什么原因 严重柱塞

    3.form的构造函数里面写入了过多复杂的逻辑

    请检查。

    2010年5月17日 7:17