【问题标题】:Should I create new BinaryReader/BinaryWriter after each use?我应该在每次使用后创建新的 BinaryReader/BinaryWriter 吗?
【发布时间】:2014-01-17 10:19:17
【问题描述】:

我有一个相关但不同的问题的场景。所以它可能看起来像一个重复的帖子,但它不是

我正在开发一个类,该类使用最终在 UI 线程上创建的 TcpClient 来读取和写入数据。当 TcpClient 创建时,设计是连接到服务器并立即创建 BinaryReaderBinaryWriter

BinaryReader 用于执行阻塞读取的专用线程。当数据到达时,我生成一个事件并传递数据进行处理。冲洗并重复。

BinaryWriter 在数据到达另一个线程时使用。现在它恰好是 UI 线程,但它不一定是。已知的一件事是它与阻塞读取器正在运行的线程不同。

因为我预先创建了二进制处理程序,我发现确保它们被正确处理是很棘手的。似乎使用 using 语句来封装他们正在使用的生活会容易得多。

但是我知道创建一个可以重复使用的对象是一种浪费,并且会给系统增加负担。尤其是 BinaryWriter,它会在一次使用后离开其范围。

这些类和IDisposable 对象的最佳实践是什么?

【问题讨论】:

    标签: c# stream tcpclient idisposable


    【解决方案1】:

    不,这不是必需的。 BinaryReader/Writer 实现 IDisposable 的唯一原因是它们承担了您传递给其构造函数的 Stream 的所有权。在 .NET Framework 中处理流的类的标准行为。

    但是您传递的 Stream 是属于您的 TcpClient 对象的 NetworkStream。它本身已经实现了 IDisposable,它使用它的 Dispose 方法来处理 NetworkStream 和 Socket。

    所以这已经处理好了,当你关闭客户端时,流已经被释放了。无需通过读取器和/或写入器再次处理它。

    【讨论】:

    • 我在 MSDN 中看到 TcpClient 是一个 IDisposible,但它的 Dispose 方法在 VS2010 中无法访问。我假设它是由 Close 内部调用的私有方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2018-11-21
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多