Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 消息传输模式下NamedPipes死锁_C#_.net_Windows_Ipc_Named Pipes - Fatal编程技术网

C# 消息传输模式下NamedPipes死锁

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,

Windows 7平台、.NET 4.0应用程序使用同一台计算机IPC的命名管道。 管道的创建如下所示:

   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上死锁