检查NamedPipeClientStream是否有要读取的内容

时间:2018-05-23 14:18:03

标签: c# named-pipes

我需要检查一个NamedPipeClientStream,看看在我尝试读取它之前是否有要读取的字节。这样做的原因是因为如果没有什么东西可以读取,那么线程会在任何读取操作中停止,而我根本就没有。即使没有要读取的字节,我也必须能够继续。

我也试过将它包装在StreamReader中,我已经看过它,但结果相同。

StreamReader sr = new StreamReader(myPipe)
string temp;
while((temp = sr.ReadLine()) != null) //Thread stops in ReadLine
{
    Console.WriteLine("Received from server: {0}", temp);
}

我需要读取操作 not 等待有待读取的字节,或者在尝试读取操作之前检查是否有要读取的字节。

PipeStream不支持Length,Position或ReadTimout属性或Seek ...

1 个答案:

答案 0 :(得分:0)

这是一个非常糟糕的模式。构造您的代码,以便有一个读取线程始终尝试读取,直到流结束。然后,让你的线程进行通信,以实现你想要的逻辑和控制流程。

通常无法检查任意Stream是否有可用数据。我认为使用命名管道是可能的。但即使你这样做,你需要确保及时读取传入的字节。没有事件发生。即使你管理所有这些代码也会非常讨厌。精神验证并不容易。

因此,只需保持阅读循环活着。您可以使该读取循环将数据排入队列(可能是BlockingCollection)。然后其他线程可以检查该队列的数据或等待数据到达。流将始终正确排干。您可以通过排队null来发送信号流。

当我说"线程"我的意思是任何给你一个线程外观的原语。这些天你永远不会使用Thread。相反,请使用async/awaitTask