【问题标题】:Best way to wait for TcpClient data to become available?等待 TcpClient 数据可用的最佳方法是什么?
【发布时间】:2010-11-12 15:44:14
【问题描述】:
while (TcpClient.Client.Available == 0)
{
    Thread.Sleep(5);
}

有没有更好的方法来做到这一点?

【问题讨论】:

    标签: c# .net tcpclient


    【解决方案1】:

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

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

    我个人认为Available 几乎没用(在流和套接字上),并且在睡眠中循环循环肯定是低效的 - 当数据没有进入时,您不希望上下文切换线程,并且您不希望在数据进来时等待睡眠结束。

    【讨论】:

    • @Jader:只有当它从另一端传递文本并且它才会在完成发送时关闭套接字。例如,不适合 HTTP KeepAlive 连接。
    • @tig:如果ReadLine 返回null,则表示流已关闭,没有更多可用行。听起来你真的应该看看网络级别发生了什么,例如使用 Wireshark。
    • 我认为他们想要Socket.Poll()Socket.Select() 中的一个,并且由于TcpClient 没有这些功能,因此理想情况下不应该使用它。阻塞读取不是好主意,因为它不允许指定时间跨度来等待数据。
    • @Hi-Angel:如果你愿意,你可以随时设置TcpClient.ReceiveTimeout...这不是你说的吗?
    • @Pluc:添加进去了。不过,我不会详细介绍等待的细节 :)
    猜你喜欢
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多