使用 (IDisposable) 与 class 字段 - ReaderWriterLockSlim 的正确用法

using (IDisposable) vs. class field - correct usage of ReaderWriterLockSlim

在将被不同线程使用的FileWriter class中,我目前使用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();
        }
    }
}

将是 "better" 方法,它是否 可能引入一些新的缺点 。我的直觉告诉我,我可能不应该每次都创建一个新的 ReaderWriterLockSlim 方法被调用,而是像 (2).[=24 中那样只创建一次=]

可悲的是,它不起作用(就好像我什至没有使用锁一样)所以我认为 (2) 不正确. 但话又说回来,如果 ReaderWriterLockSlim 不打算像 (2) 中那样使用,为什么要实施 IDisposable


ReaderWriterLockSlim的正确用法是什么?

并非每个 IDisposable 直接 using 语句中使用。另一种模式是,如果您的 classes 字段 中有一个 IDisposable(并且您的 class "owns" 对象1), 那么 你的 class 也应该实现 IDisposable 并清理 its Dispose.

期间的一次性用品

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

参见Dispose Pattern

DO implement the Basic Dispose Pattern on types containing instances of disposable types. See the Basic Dispose Pattern section for details on the basic pattern.


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