using(IDisposable)vs class field - 正确使用ReaderWriterLockSlim

Tho*_*kow 0 c# using-statement readerwriterlockslim

FileWriter将由不同线程使用的类中,我当前使用a 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个确实有效.但在那之后,我读了那个ReaderWriterLockSlim工具IDisposable,所以我想知道是否

(2)

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

将是"更好"的方法,是否会引入一些新的缺点.我的直觉告诉我,每次调用该方法我可能不应该创建一个新的ReaderWriterLockSlim,而只是一次(2).

可悲的是,它不起作用(好像我甚至没有使用锁),所以我认为这(2)是不正确的.但话又说回来,为什么要ReaderWriterLockSlim实施,IDisposable如果没有计划用作(2)


什么是正确的用法ReaderWriterLockSlim

Dam*_*ver 7

不是每个IDisposable直接用于using声明中.另一种模式是,如果你的IDisposable一个类字段中有一个(并且你的类"拥有"该对象1),那么你的类也应该实现IDisposable并清理它的一次性用品Dispose.

你的重写错误是正确的,因为每个调用者都使用不同的锁定对象,因此不会发生排除.

请参阅处理模式:

在包含一次性类型实例的类型上实现Basic Dispose Pattern.有关基本模式的详细信息,请参见" 基本配置模式"部分.


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

  • 我想指出的是,只有**拥有**一次性成员的班级才应该处理这些资源.类不应该丢弃一次性成员的例子是依赖注入的情况. (2认同)