消息传输模式下NamedPipes死锁

时间:2014-09-04 13:43:14

标签: c# .net windows ipc named-pipes

Windows 7平台,使用NamedPipes进行同机IPC的.NET 4.0应用程序。 管道创建如下:

   new NamedPipeServerStream(
        "test",
        PipeDirection.InOut,
        -1,
        PipeTransmissionMode.Message,
        PipeOptions.Asynchronous,
        128 * KB,
        128 * KB,
        _pipeSecurity)
        {
            ReadMode = PipeTransmissionMode.Message
        };

客户端管道具有相同的设置。管道连接客户端后,他们开始以两种方式发送大量流量。 使用BeginRead / EndRead读取数据,使用阻塞Write()调用在专用线程上完成写入。 当消息的大小小于或等于128Kb时,一切都很好。 如果消息大小更大(例如256K),则某些时间服务器的异步读取不响应。客户端表示已将所有数据写入管道,但服务器未接收OnReadEnd回调(尽管调试器已确认BeginRead已100%调用)。 请注意,测试确实适用于双向发送的一些数据量,但突然阻塞了某一部分数据(消息)。

我查看了Chromium项目,了解他们如何使用命名管道进行IPC。它们支持高达128Mb的消息(根据源代码)。唯一的区别:本机(C ++)与.NET4和消息模式与字节模式。另一个OSS项目"命名管道包装"用C#编写(参见GitHub)声称它可以处理高达300Mb的消息,它也使用字节模式。

总结一下,我怀疑这个问题与消息传输模式有关。并且IOCP无法通知我的服务器应用程序下一部分到达。值得一提的是,读取是通过相当于Pipe的IO缓冲区大小的块来完成的(在我的例子中是128Kb)。

问题:您在使用NamedPipes时是否注意到与使用消息传输模式相关的任何问题。无论是.NET还是本机应用程序。

谢谢!

0 个答案:

没有答案