积极答复者
socket 窗体问题

问题
-
最近做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)
{
}
}
}不知道是什么原因,请教解决方法,在线等..............
答案
-
反白出现的原因
一般是由于form的初始化时间过长 导致form的paint的操作等待很久不能执行 绘制基本的控件
所以从这个角度出发 你应该去调试下 检查是否有某个方法等待执行的时间特别长
用socket特别注意的问题是用了某些方法会柱塞当前线程(看起来就像是当前最近的操作一直处于不响应的状态)
我猜你的代码可能给在这些地方存在问题
1. foreach(Users user in listener.userList)
2. _client.Receive 由于网络或什么原因 严重柱塞
3.form的构造函数里面写入了过多复杂的逻辑
请检查。
- 已标记为答案 KeFang Chen 2010年5月20日 3:22
全部回复
-
反白出现的原因
一般是由于form的初始化时间过长 导致form的paint的操作等待很久不能执行 绘制基本的控件
所以从这个角度出发 你应该去调试下 检查是否有某个方法等待执行的时间特别长
用socket特别注意的问题是用了某些方法会柱塞当前线程(看起来就像是当前最近的操作一直处于不响应的状态)
我猜你的代码可能给在这些地方存在问题
1. foreach(Users user in listener.userList)
2. _client.Receive 由于网络或什么原因 严重柱塞
3.form的构造函数里面写入了过多复杂的逻辑
请检查。
- 已标记为答案 KeFang Chen 2010年5月20日 3:22