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还是本机应用程序。
谢谢!