【问题标题】:Named pipes underlying stream命名管道底层流
【发布时间】:2020-04-06 17:25:25
【问题描述】:

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

【问题讨论】:

    标签: c# named-pipes


    【解决方案1】:

    没有。流不会神奇地跟踪使用它们的每个 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
    

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

    【讨论】:

    • 好的,感谢您的回复。处理连接到命名管道流的流读取器/写入器的正确方法是什么。如果我处理流读取器/写入器,它会完全断开管道,所以我将无法进行多次读取/写入
    • leaveOpen参数设置为true的情况下打开你的读写器。这样,处理读取器/写入器会将所有剩余数据刷新到管道中,但保持打开状态。这样,您可以进行适当的清理,但您可以保留管道以供以后使用。
    • 感谢@etienne 的工作。我让流打开并在使用命名管道完成后处理它
    猜你喜欢
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    相关资源
    最近更新 更多