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

时间:2018-06-08 07:53:35

标签: c# using-statement readerwriterlockslim

在将由不同线程使用的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中使用,为什么会IDisposable实施(2)

ReaderWriterLockSlim的正确用法是什么?

1 个答案:

答案 0 :(得分:7)

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

您确认重写是错误的,因为每个来电者都使用不同的锁定对象,因此不会发生任何排除。

请参阅Dispose Pattern

  

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

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