【发布时间】:2010-11-12 15:44:14
【问题描述】:
while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
有没有更好的方法来做到这一点?
【问题讨论】:
while (TcpClient.Client.Available == 0)
{
Thread.Sleep(5);
}
有没有更好的方法来做到这一点?
【问题讨论】:
绝对!只需在直播中致电Read(...)。这将阻塞,直到数据可用。除非您真的有 直接使用TcpClient,否则我通常会在流中尽可能多地使用。如果你想使用套接字,只需调用Receive(byte[]),它将阻塞直到数据可用(或套接字关闭)。
现在如果不想阻塞,可以使用Stream.BeginRead 或Socket.BeginReceive 异步工作。 (或 ReadAsync 从 .NET 4.5 开始。)
我个人认为Available 几乎没用(在流和套接字上),并且在睡眠中循环循环肯定是低效的 - 当数据没有进入时,您不希望上下文切换线程,并且您不希望在数据有进来时等待睡眠结束。
【讨论】:
ReadLine 返回null,则表示流已关闭,没有更多可用行。听起来你真的应该看看网络级别发生了什么,例如使用 Wireshark。
Socket.Poll() 或Socket.Select() 中的一个,并且由于TcpClient 没有这些功能,因此理想情况下不应该使用它。阻塞读取不是好主意,因为它不允许指定时间跨度来等待数据。
TcpClient.ReceiveTimeout...这不是你说的吗?