【发布时间】:2020-04-06 17:25:25
【问题描述】:
在 c# 中使用命名管道时。如果我们使用 using 语句创建客户端和服务器管道,则将 streamReader 和 streamWriter 连接到它。当 namedPipe 被释放时(在 using 语句的末尾),streamReader 和 StreamWriter 是否也被释放?
【问题讨论】:
标签: c# named-pipes
在 c# 中使用命名管道时。如果我们使用 using 语句创建客户端和服务器管道,则将 streamReader 和 streamWriter 连接到它。当 namedPipe 被释放时(在 using 语句的末尾),streamReader 和 StreamWriter 是否也被释放?
【问题讨论】:
标签: c# named-pipes
没有。流不会神奇地跟踪使用它们的每个 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
换句话说,默认情况下,读者或作者拥有他们的流,这意味着他们有责任在他们自己关闭时关闭它们。不拥有其流的读取器和写入器只会在释放时刷新其内部缓冲区,否则不会触及流。
【讨论】:
leaveOpen参数设置为true的情况下打开你的读写器。这样,处理读取器/写入器会将所有剩余数据刷新到管道中,但保持打开状态。这样,您可以进行适当的清理,但您可以保留管道以供以后使用。