等待TcpClient数据可用的最佳方法是什么?

14
while (TcpClient.Client.Available == 0)
{
    Thread.Sleep(5);
}

有更好的方法吗?

1个回答

28

当然可以!只需在流上调用Read(...)。这将阻塞直到数据可用,除非你确实必须直接使用TcpClient,我通常尽可能多地使用流。如果你想使用套接字,只需调用Receive(byte[]),这将阻塞直到数据可用(或套接字关闭)。

现在,如果你不想阻塞,可以使用Stream.BeginReadSocket.BeginReceive以异步方式工作。(自.NET 4.5起,也可以使用ReadAsync

我个人认为Available在流和套接字上都几乎没用,循环等待后再睡眠绝对低效——当数据未到达时,不必上下文切换线程;当数据已经到达时,也不必等待睡眠结束。


1
如果ReadLine返回null,那就意味着流已经关闭,没有更多的可用行了。看起来你应该查看网络层面上发生了什么,例如使用Wireshark。 - Jon Skeet
2
@Hi-Angel:如果你想要的话,你总是可以设置TcpClient.ReceiveTimeout...那不就是你所说的吗? - Jon Skeet
@JonSkeet 啊,那些副作用 ☺ - Hi-Angel
只是为了补充答案,自.NET ......4.5以来也可以使用ReadAsync。 - Pluc
1
@Pluc:已添加。不过我不会详细介绍等待的所有细节 :) - Jon Skeet
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接