命名管道底层流
Named pipes underlying stream
在 C# 中使用命名管道时。如果我们使用 using 语句创建客户端和服务器管道,然后将 streamReader 和 streamWriter 连接到它。当 namedPipe 被处置时(在 using 语句的末尾),streamReader 和 StreamWriter 是否也被处置?
没有。流不会神奇地跟踪每个使用它们的 StreamReader
或 StreamWriter
实例。任何流都是如此,而不仅仅是命名管道。
var stream = ...;
var reader = new StreamReader(stream);
stream.Dispose();
// reader is not disposed here
但是,默认情况下,释放 StreamReader
或 StreamWriter
会释放它们所构造的流:
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
换句话说,默认情况下,读者或作者拥有他们的流,这意味着他们有责任在他们自己关闭时关闭它们。不拥有自己的流的读取器和写入器只会在处理时刷新其内部缓冲区,但不会影响流。
在 C# 中使用命名管道时。如果我们使用 using 语句创建客户端和服务器管道,然后将 streamReader 和 streamWriter 连接到它。当 namedPipe 被处置时(在 using 语句的末尾),streamReader 和 StreamWriter 是否也被处置?
没有。流不会神奇地跟踪每个使用它们的 StreamReader
或 StreamWriter
实例。任何流都是如此,而不仅仅是命名管道。
var stream = ...;
var reader = new StreamReader(stream);
stream.Dispose();
// reader is not disposed here
但是,默认情况下,释放 StreamReader
或 StreamWriter
会释放它们所构造的流:
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
换句话说,默认情况下,读者或作者拥有他们的流,这意味着他们有责任在他们自己关闭时关闭它们。不拥有自己的流的读取器和写入器只会在处理时刷新其内部缓冲区,但不会影响流。