命名管道底层流

Named pipes underlying stream

在 C# 中使用命名管道时。如果我们使用 using 语句创建客户端和服务器管道,然后将 streamReader 和 streamWriter 连接到它。当 namedPipe 被处置时(在 using 语句的末尾),streamReader 和 StreamWriter 是否也被处置?

没有。流不会神奇地跟踪每个使用它们的 StreamReaderStreamWriter 实例。任何流都是如此,而不仅仅是命名管道。

var stream = ...;
var reader = new StreamReader(stream);
stream.Dispose();
// reader is not disposed here

但是,默认情况下,释放 StreamReaderStreamWriter 会释放它们所构造的流:

var stream = ...;
using(var reader = new StreamReader(stream))
    // ...
// stream is disposed here

也就是说,除非您通过将 true 传递给它们的 leaveOpen 参数(下面是最后一个参数)来构造它们:

var stream = ...;
using(var reader = new StreamReader(stream, encoding, false, 4096, true))
    // ...
// stream is not disposed here

换句话说,默认情况下,读者或作者拥有他们的流,这意味着他们有责任在他们自己关闭时关闭它们。不拥有自己的流的读取器和写入器只会在处理时刷新其内部缓冲区,但不会影响流。