0

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

(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();
        }
    }
}

确实有效。但在那之后,我读到了ReaderWriterLockSlimimplements 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)是不正确的。但是话又说回来,如果不打算像 in 那样使用它,为什么还要ReaderWriterLockSlim实施呢?IDisposable(2)


的正确用法是ReaderWriterLockSlim什么?

4

1 回答 1

7

并不是每个IDisposable直接用于using语句中。另一种模式是,如果您的IDisposable某个类字段中有一个(并且您的类“拥有”该对象1),那么您IDisposable还应该在.Dispose

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

请参阅处置模式

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


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

于 2018-06-08T07:57:42.753 回答