【问题标题】:using (IDisposable) vs. class field - correct usage of ReaderWriterLockSlim使用(IDisposable)与类字段 - ReaderWriterLockSlim 的正确用法
【发布时间】:2018-11-18 05:41:16
【问题描述】:

在将由不同线程使用的FileWriter 类中,我目前使用ReaderWriterLockSlim 来防止两个线程同时尝试写入文件时发生错误,如下所示:

(1)

public class FileWriter
{
    private ReaderWriterLockSlim readerWriterLock = new ReaderWriterLockSlim();

    public void WriteToFile(string message)
    {
        try
        {
            this.readerWriterLock.EnterWriteLock();    
            // the writing happens here
        }
        finally
        {
            this.readerWriterLockSlim.ExitWriteLock();
        }
    }
}

哪个有效。但在那之后,我读到ReaderWriterLockSlim 实现了IDisposable,所以我想知道是否

(2)

public class FileWriter
{
    public void WriteToFile(string message)
    {
        using (ReaderWriterLockSlim readerWriterLockSlim = new ReaderWriterLockSlim())
        {
            readerWriterLockSlim.EnterWriteLock();
            // the writing happens here
            readerWriterLockSlim.ExitWriteLock();
        }
    }
}

将是“更好”的方法,以及它是否可能会引入一些新的缺点。我的直觉告诉我,我可能不应该在每次调用该方法时都创建一个新的 ReaderWriterLockSlim,而应该像在 (2) 中那样只创建一次。

遗憾的是,它不起作用(好像我什至没有使用过锁),所以我认为(2) 不可能是正确的。 但是话又说回来,如果ReaderWriterLockSlim 不打算像(2) 那样使用,为什么还要实现IDisposable


ReaderWriterLockSlim的正确用法是什么?

【问题讨论】:

  • 一个允许多个 readers 的 FileWriter ?某些东西的名称不正确。
  • @bommelding 对,实际用例有点复杂,所以我必须想出一些更符合 MVCE 的东西。

标签: c# using-statement readerwriterlockslim


【解决方案1】:

并非每个IDisposable直接using 语句中使用。另一种模式是,如果您的某个类字段中有IDisposable(并且您的类“拥有”该对象1),那么您的类 还应该实现IDisposable 并在Dispose 期间清理 一次性用品。

你是正确的,你的重写是错误的,因为每个调用者都使用不同的锁对象,所以没有发生排除。

Dispose Pattern:

务必对包含一次性类型实例的类型实施基本处置模式。有关基本模式的详细信息,请参阅Basic Dispose Pattern 部分。


1感谢Dirk 对重要警告的评论。如果您处于不尝试控制对象生命周期的情况,则不适合 Dispose 此类对象

【讨论】:

  • 感谢您的澄清。我什至不知道有IDisposable 成员的类应该自己实现IDisposable。我会尽快接受答案。
  • 我想指出,只有拥有一次性成员的类应该负责处理这些资源。类不应释放一次性成员的示例是依赖注入。
猜你喜欢
  • 2013-01-18
  • 1970-01-01
  • 2012-04-19
  • 2015-04-27
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多