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

C# 等待TcpClient数据可用的最佳方法?,c#,.net,tcpclient,C#,.net,Tcpclient,有更好的方法吗?绝对有!只需在流中调用Read(…)。这将阻止,直到数据可用。除非您真的必须直接使用TcpClient,否则我通常会在流上尽可能多地使用它。如果您想使用套接字,只需调用Receive(byte[]),它将阻塞,直到数据可用(或套接字关闭) 现在,如果不想阻塞,可以使用Stream.BeginRead或Socket.BeginReceive异步工作。(或从.NET 4.5开始的ReadAsync) 我个人认为可用的几乎毫无用处(在流和套接字上),而使用睡眠循环显然效率低下-当数据未

有更好的方法吗?

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

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


我个人认为可用的
几乎毫无用处(在流和套接字上),而使用睡眠循环显然效率低下-当数据未进入时,您不希望必须切换线程的上下文,而且,当数据进入时,您不必等待睡眠结束。

@Jader:只有当它从另一端传递文本时,它才会在完成发送后关闭套接字。例如,不适用于HTTP KeepAlive连接。@tig:如果
ReadLine
返回null,则表示流已关闭,并且没有更多可用的行。听起来你真的应该看看网络层面上发生了什么,比如Wireshark。我认为他们更想要一个
Socket.Poll()
Socket.Select()
,而且由于TcpClient没有这些函数,理想情况下不应该使用它。阻塞读取不是个好主意,因为它不允许指向等待数据的时间跨度。@Hi Angel:如果需要,您可以随时设置
TcpClient.ReceiveTimeout
。。。这不正是你所说的吗?@Pluc:补充道。不过,我不会详细讨论等待的所有细节:)
while (TcpClient.Client.Available == 0)
{
    Thread.Sleep(5);
}