C# 消息传输模式下NamedPipes死锁
Windows 7平台、.NET 4.0应用程序使用同一台计算机IPC的命名管道。 管道的创建如下所示:C# 消息传输模式下NamedPipes死锁,c#,.net,windows,ipc,named-pipes,C#,.net,Windows,Ipc,Named Pipes,Windows 7平台、.NET 4.0应用程序使用同一台计算机IPC的命名管道。 管道的创建如下所示: new NamedPipeServerStream( "test", PipeDirection.InOut, -1, PipeTransmissionMode.Message, PipeOptions.Asynchronous, 128 * KB, 128 * KB,
new NamedPipeServerStream(
"test",
PipeDirection.InOut,
-1,
PipeTransmissionMode.Message,
PipeOptions.Asynchronous,
128 * KB,
128 * KB,
_pipeSecurity)
{
ReadMode = PipeTransmissionMode.Message
};
客户端管道具有相同的设置。在管道连接了客户端之后,它们开始通过两种方式发送大流量。
读取数据是使用BeginRead/EndRead完成的,写入是使用阻塞写入调用在专用线程上完成的。
当消息大小小于或等于128Kb时,一切都很正常。
如果消息大小大于256K,有时服务器的异步读取不会响应。客户端说它已经将所有数据写入管道,但服务器并没有收到OnReadEnd回调,尽管BeginRead被100%调用,这已由调试器确认。
请注意,该测试确实适用于以两种方式发送的某些数据量,但会突然阻塞数据消息的某一部分
我检查了Chromium项目,看看他们是如何为IPC使用命名管道的。根据源代码,它们支持高达128Mb的消息。唯一的区别:本机C++ +vs. NET4和消息模式与字节模式。另一个名为Pipes Wrapper的OSS项目是用C语言编写的。参见GitHub,它声称它可以处理高达300Mb的消息,并且还使用字节模式
总而言之,我怀疑问题与消息传输模式有关。IOCP无法通知我的服务器应用程序下一部分已到达。同样值得一提的是,在我的例子中,读取是由与管道的IO缓冲区大小128Kb相等的块完成的
问题:在使用命名管道时,您是否注意到与使用消息传输模式相关的任何问题。无论是.NET还是本机应用程序
谢谢 好问题,但有一条评论:管道没有bug。IOCP在任何方面都没有失败。错误很可能存在于您的代码中。可能不是管道,而是框架粘合层或由该层导致的错误使用。。或者别的什么。此等式中的变量太多。如果忘记添加PipeOptions.Asynchronous,它肯定会在WriteAsync上死锁