R和textMessage都属于全局变量,因为服务端是连着发送的,接收端会瞬间分出两个线程执行for (int i = 0; i < R.Length; i++) { textMessage.AppendText(R[i].ToString("X2")); } textMessage.AppendText("\n");此时R在两次接收中被赋予了不同的值,就会发生同步问题.所以在不同线程访问R和textMessage时,应该定义一个全局object obj = new object(),然后把上述代码放在lock(obj) { // }中。 另外数据在发送和接收时,最好在包的开头定义数据长度(正式应用是必须的),这样可以准确判断是否接收到一个完整的包。
R = new byte[reDatas.Length]; R = reDatas; 这两句同样也有同步问题,既然你已经使用了异步socket,那么没有必要再使用thread,如果担心处理过程长而影响接收,可以把beginreceive放到处理之前,然后处理时只需要锁一次即可,不用新开thread再次加锁。 规范的做法是把接收到的数据copy到一个较大的缓冲区,然后有一个线程去处理那个大缓冲区中的各个包。
{
//DOSOMETHING
}
这东西绝对得设计好的结构,要不很不好用.
还是花钱雇佣个大师吧
{
textMessage.AppendText(R[i].ToString("X2"));
}
textMessage.AppendText("\n");此时R在两次接收中被赋予了不同的值,就会发生同步问题.所以在不同线程访问R和textMessage时,应该定义一个全局object obj = new object(),然后把上述代码放在lock(obj)
{
//
}中。
另外数据在发送和接收时,最好在包的开头定义数据长度(正式应用是必须的),这样可以准确判断是否接收到一个完整的包。
R = new byte[reDatas.Length];
R = reDatas;
这两句同样也有同步问题,既然你已经使用了异步socket,那么没有必要再使用thread,如果担心处理过程长而影响接收,可以把beginreceive放到处理之前,然后处理时只需要锁一次即可,不用新开thread再次加锁。
规范的做法是把接收到的数据copy到一个较大的缓冲区,然后有一个线程去处理那个大缓冲区中的各个包。