while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
有更好的方法吗?
当然可以!只需在流上调用Read(...)
。这将阻塞直到数据可用,除非你确实必须直接使用TcpClient
,我通常尽可能多地使用流。如果你想使用套接字,只需调用Receive(byte[])
,这将阻塞直到数据可用(或套接字关闭)。
现在,如果你不想阻塞,可以使用Stream.BeginRead
或Socket.BeginReceive
以异步方式工作。(自.NET 4.5起,也可以使用ReadAsync
)
我个人认为Available
在流和套接字上都几乎没用,循环等待后再睡眠绝对低效——当数据未到达时,不必上下文切换线程;当数据已经到达时,也不必等待睡眠结束。
ReadLine
返回null,那就意味着流已经关闭,没有更多的可用行了。看起来你应该查看网络层面上发生了什么,例如使用Wireshark。 - Jon SkeetTcpClient.ReceiveTimeout
...那不就是你所说的吗? - Jon Skeet