C# 匿名管道-无法获取所有数据

C# 匿名管道-无法获取所有数据,c#,pipe,C#,Pipe,我使用匿名管道在两个进程之间发送命令。通常情况下,一切都很好,但消费者收到的命令有时会被截断,只有一半通过 这是我发送命令的方式: AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out, HandleInheritability.Inheritable); StreamWriterpipeWriter = new StreamWriter(this.pipeServer

我使用匿名管道在两个进程之间发送命令。通常情况下,一切都很好,但消费者收到的命令有时会被截断,只有一半通过

这是我发送命令的方式:

AnonymousPipeServerStream pipeServer = new AnonymousPipeServerStream(PipeDirection.Out,     HandleInheritability.Inheritable);
StreamWriterpipeWriter = new StreamWriter(this.pipeServer) { AutoFlush = true };
pipeWriter.WriteLine(command);
我是这样读的:

AnonymousPipeClientStream pipeClient = new AnonymousPipeClientStream(PipeDirection.In, pipeId);
StreamReader pipeReader = new StreamReader(this.pipeClient);
string command = pipeReader.ReadLine();
该命令实际上是一个小的base64转换pdf文件,包含一些附加数据。写入pipeWriter的命令具有正确的形式(至少日志告诉我们这一点),并且使用者收到的命令通常是正常的。然后,有时情况并非如此,出于某种原因,消费者只能得到其中的一部分

当我们尝试再次发送相同的命令时,它将通过。再次发送命令将处理旧的使用者,但生产者将保持不变


发生这种情况有什么已知的原因吗?我是否遗漏了一些明显的内容?

在编写器端,您需要在关闭管道之前调用
WaitForPipeDrain

这是管道的底层Windows实现中的一个怪癖。它没有区分“我关闭管道是因为出了问题”和“我关闭管道是因为我已经完成了”。它实现前者,丢弃缓冲区中的数据,因此要求编写器明确确保存储在管道缓冲区中的数据在关闭管道之前发送给客户端。本机winapi函数是FlushFileBuffers()


NET包装器类本可以让这一点更清楚一些,但他们没有做到。因此,您还必须将其显式化,调用FlushFileBuffers()函数需要调用WaitForPipeDrain()。在对AnonymousPipeServerStream调用Close()或Dispose()之前执行此操作。因为异常情况而关闭管道时不要这样做。

为什么?我根本不想等排水管出来。@韦德:你想让水管溢出来吗?你想处理那个烂摊子吗!?:)在我们的情况下,溢出的可能性很低,实际上不需要等待。。。但是如果我们的bug出现了,这会有什么影响呢?好吧,你需要等待所有的数据通过。问题是,在管道一次将所有内容卸下之前,您就结束了通信。所以…你得等一切都“耗尽”了。试着打电话给WaitForPipeDrain,看看会发生什么。我和你有类似的问题——添加WaitForPipiDrain解决了它。回答得很好。非常感谢。