如何检查在StreamReader上是否有可读内容?

4
我需要检查我的客户端是否有缓冲区,以便我不必等待写入。
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' 是否为空?

注:使用Mono的C#


如果(Say!= null),那就回答你自己的问题吧! - M.kazem Akhgary
3个回答

4
另外,StreamReader.Peek()会在文件末尾或没有可读内容时返回-1。可以按照以下方式进行检查:
while(StreamReader.Peek() != -1){
    //Your code here
}

2
他还在等待着 :( - Marlon Henry Schweigert
我不明白? 当然,在你的情况下,你会使用'client.Reader.Peek()',而不是StreamReader.Peek()。 - Ahmed Anwar

2
如何检查我是否有要读取的内容在StreamReader上?
我不清楚StreamReader,但对于TcpClient,您可以使用TcpClient.GetStream()方法,该方法返回NetworkStream,而NetworkStream又具有DataAvailable属性。这在TcpClient.GetStream文档的“备注”部分中有解释:
您可以通过检查DataAvailable属性来避免在读取操作上阻塞。
编辑:我发布了这篇文章,因为您的代码正在运行到特定的域。虽然其他答案/评论中描述的一般方法适用于正常的有限流(例如FileStream,MemoryStream等),但对于无限流(例如NetworkStream)则不适用。

StreamReader a = new StreamReader(client.GetStream()) 为此套接字创建了一个 StreamReader。我只在处理 StreamReader :) - Marlon Henry Schweigert
但底层的Stream仍然是NetworkStreamStreamReader只是在流的上层提供了一个抽象。 - Ivan Stoev
慢吗?((NetworkStream)client.Reader.BaseStream).DataAvailable - Ivan Stoev
是的...在客户端类上创建一个NetworkStream以避免每次获取...但现在这不显示所有行 :( - Marlon Henry Schweigert
好的,上面只是回答了你如何检查的问题。这并不意味着你必须使用它 - 你的代码对于监听器来说是完美的,而async/await会做必要的魔法使其更加高效。这类似于消息循环 - 你可以检查消息队列中是否有消息,但如果此时没有,那并不意味着将来不会有。 - Ivan Stoev
感谢您的帮助 :) - Marlon Henry Schweigert

1

StreamReader.ReadLine() 方法在流已经到达结束或没有剩余可读内容时会返回null。因此,您可以检查该返回值以验证是否还有内容可读。

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

string Say = await client.Reader.ReadLineAsync() != null; 如果 (Say != null) {...} 它已经进行了检查。 - Marlon Henry Schweigert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接