线程与Socket问题,怪异
我写了一个线程,设置了它的启动函数如下
private void receive()
{
while (Checked)
{
Receive.AppendText(i.ToString());
byte[] str = new byte[64];
nws = new NetworkStream(sock);
nws.Read(str,0,str.Length);
Receive.AppendText(System.Text.Encoding.BigEndianUnicode.GetString(str) + "\r\n");
}
}
现在问题来了,当我设置它开始时,把Checked设为了true,这样Start()后,它就开始工作了,这个时候测试它的状态,是ThreadState.Running,但是文本框里只显示了一个0,好象是只循环了一遍一样,测试发现问题出在new.Read(str,0,str.Length);这一句上,只要把这句隐藏掉,程序就能显示好多0,也能正常终止了,谁能告诉我为什么加上new.Read(str,0,str.Length);后,它会变得好像不循环一样吗?
问题点数:50、回复次数:4Top
1 楼wangsaokui(无间道III(终极无间)C#MVP)回复于 2005-06-03 22:15:31 得分 0
NetworkStream.Read 方法
该方法将数据读入 buffer 参数并返回成功读取的字节数。如果没有可读取的数据,则 NetworkStream.Read 方法将一直阻塞到有数据可用为止。为避免阻塞,可使用 DataAvailable 属性来确定数据是否在传入网络缓冲区中排队等待读取。如果 DataAvailable 返回 true,Read 操作将立即完成。Read 操作将读取尽可能多的可用数据,直到达到由 size 参数所指定的字节数为止。如果远程主机关闭了连接并且已经接收到所有可用的数据,Read 方法将立即完成并返回零字节。
注意:Read 操作将读取尽可能多的可用数据,直到达到由 size 参数所指定的字节数为止
也就是说这个方法会一直阻塞到把64个字节数组str填充满为止,在此前是不会到下一语句的。
参见
ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html/frlrfSystemNetSocketsNetworkStreamClassReadTopic.htmTop
2 楼Cry_Out(东北)回复于 2005-06-03 22:40:10 得分 50
markTop
3 楼zlopen(MadeInChina)回复于 2005-06-03 22:52:38 得分 0
讲的不错,收藏Top
4 楼gccr(古城痴人)回复于 2005-06-04 00:07:19 得分 0
强。Top




