可以在异步命名管道上执行同步读/写操作吗?

时间:2017-08-31 20:52:15

标签: c# .net named-pipes namedpipeserverstream

我的期望是这种情况,在使用PipeOptions.Asynchronous(以及客户端)创建NamedPipeServerStream之后,仍然可以对管道执行同步读/写操作。

但是,我发现当服务器同步写入超出out缓冲区大小的字节时,客户端会在读取时阻塞,永远不会返回,即使服务器已写入适当数量的数据来满足该条件读取。

更新:我还没有能够制作一个简单的repro案例,但我已经将我认为是PipeStream类的可疑结果分离出来了。我有以下代码:

byte[] buffer = new byte[ 66754 ];
int n1 = pipeStream.Read( buffer, 0, 66754 ); // Read returns 65536
int n2 = pipeStream.Read( buffer, buffer.Length - 1218, 1218 ); // Read blocks

此代码在管道的另一端写入66754字节数据并且读取端尚未读取此数据的情况下执行(注意,两端管道的输入和输出最大缓冲区大小为65536和65536 + 1218 == 66754)。

当执行此代码时,第一次读取返回n1 == 65536,表示并非所有预期的数据都被读取,因此我执行另一次读取,询问剩余数据。这个读取无限期地阻塞,永远不会返回。

然而,在第二次读取之前,当我检查缓冲区时,我看到了写入的预期数据,即使在65535位置之后!

似乎第一次读取读取所有数据,但只返回最大缓冲区大小,因此第二次读取挂起,因为没有更多数据要读取。但是,我不知道这是因为我被错误地告知了第一次阅读时读取的数据量。

现在,稍微修改一下这段代码。这个新代码的运行条件与前一代完全相同。

byte[] buffer = new byte[ 66754 ];
int n1 = pipeStream.Read( buffer, 0, 65536); // Read returns 65536
int n2 = pipeStream.Read( buffer, buffer.Length - 1218, 1218 ); // Read blocks

注意,现在第一个Read要求只读取最大缓冲区大小65536.在这种情况下,n1 == 65536,当第二次读取发生时,它成功返回n2 == 1218。

这里,它不是要求所有数据的第一次读取,而是要求max buffersize。这些是Reads的预期正确结果。

这表明PipeStream代码中存在一个错误,它从Read中返回错误的值。

我将继续尝试为此制作一个简单的复制案例。

另一次更新:发现这个: NamedPipe's ReadByte hangs 似乎与我的问题有关。

0 个答案:

没有答案