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

Jad*_*ias 11 .net c# tcpclient

while (TcpClient.Client.Available == 0)
{
    Thread.Sleep(5);
}
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

Jon*_*eet 26

绝对!只需呼叫Read(...)流.这将阻止数据可用.除非你真的必须TcpClient直接使用,我通常会在流上做尽可能多的事情.如果你想使用套接字,只需调用Receive(byte[])哪个将阻塞,直到数据可用(或套接字关闭).

现在,如果您不想阻止,可以使用Stream.BeginReadSocket.BeginReceive异步工作.(或者ReadAsync从.NET 4.5开始.)

我个人发现Available它几乎没用(在流和套接字上)并且循环使用睡眠肯定是低效的 - 你不希望在数据没有进入时上下文切换线程,而你没有希望有等待睡眠时的数据来完成已经进来了.

  • @Hi-Angel:如果你愿意,你总是可以设置`TcpClient.ReceiveTimeout`......这不是你在说什么吗? (2认同)