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);
}