【问题标题】:How to check if I have something to read on a StreamReader?如何检查我在 StreamReader 上是否有要阅读的内容?
【发布时间】:2015-12-27 13:11:53
【问题描述】:

我需要检查我的客户端是否在缓冲区中有东西,所以我没有等着写。

private async void ThreadMethod_ListenClient()
    {
        while (true) {
            if (ClientQueue.Count == 0)
                continue;
            Client client = (Client)ClientQueue.Dequeue ();
            if (client.Reader != null) {
                string Say = await client.Reader.ReadLineAsync();
                if (Say != null) {
                    if (Say.Length != 0) {
                        Console.WriteLine (Say);
                    }
                }
            }
            ClientQueue.Enqueue (client);

        }
    }

client.Reader : 来自 TcpClient 的 StreamReader

client.Socket : TcpClient

如何检查'client.Reader'是否为空?

obs。带有单声道的 C#

【问题讨论】:

  • if (Say != null) 回答您自己的问题!

标签: c# sockets streamreader


【解决方案1】:

还有StreamReader.Peek(),当到达文件末尾或没有可读取的内容时返回-1。 可以检查如下:

while(StreamReader.Peek() != -1){
    //Your code here
}

【讨论】:

  • 他还在等:(
  • 我不明白?当然,在您的情况下,您将使用 'client.Reader.Peek()' 而不是 StreamReader.Peek()
【解决方案2】:

如何在 StreamReader 上检查我是否有要阅读的内容?

我不知道StreamReader,但对于TcpClient,您可以使用TcpClient.GetStream() 方法返回NetworkStream,而DataAvailable 又具有DataAvailable 属性。这在TcpClient.GetStream documentationRemarks 部分进行了说明:

您可以通过检查 DataAvailable 属性来避免阻塞读取操作。

编辑:我发布此内容是因为您的代码在特定域中运行。虽然其他答案/cmets 中描述的一般方法适用于普通的有限流(如 FileStreamMemoryStream 等),但它不适用于像 NetworkStream 这样的无限流。

【讨论】:

  • StreamReader a = new StreamReader (client.GetStream ( )) 为此套接字创建了 StreamReader。我只在 StreamReader 上工作 :)
  • Stream 的底层仍然是NetworkStreamStreamReader 只是流之上的抽象。
  • 慢? ((NetworkStream)client.Reader.BaseStream).DataAvailable
  • 是的...在客户端类上创建一个 NetworkStream 以便每次都不要获取...但这现在不显示所有行:(
  • 嗯,以上只是回答了您的问题如何检查。这并不意味着您必须使用它 - 您的代码非常适合听众,async/await 会发挥必要的魔力以使其高效。类似于消息循环——你可以检查消息队列中是否有消息,但如果此时没有,不代表以后不会有。
【解决方案3】:

StreamReader.ReadLine() 方法返回 null 如果流的末尾已经到达或者没有任何东西可以读取。因此,您可以检查以验证是否有要阅读的内容。

if (client.Reader != null && client.Reader.ReadLine() != null)

【讨论】:

  • string Say = await client.Reader.ReadLineAsync () != null; if (Say != null) {...} 它已经检查了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 1970-01-01
  • 1970-01-01
  • 2023-01-19
相关资源
最近更新 更多