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

有一个更好的方法吗?

4

1 回答 1

27

绝对地!只需Read(...)在流中调用即可。这将阻塞,直到数据可用。除非你真的必须直接使用,否则TcpClient我通常会尽可能多地在流上做。如果要使用套接字,只需调用Receive(byte[])which 将阻塞直到数据可用(或套接字关闭)。

现在如果你不想阻塞,你可以使用Stream.BeginReadorSocket.BeginReceive来异步工作。(或ReadAsync从 .NET 4.5 开始。)

我个人觉得Available它几乎没用(在流和套接字上),并且在睡眠中循环肯定是低效的——当数据没有进来时,你不想上下文切换线程,你不当数据进入时,希望必须等待睡眠完成。

于 2009-07-21T13:42:18.333 回答