использование (IDisposable) против поля класса - правильное использование ReaderWriterLockSlim - PullRequest
0 голосов
/ 08 июня 2018

В классе 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 голосов
/ 08 июня 2018

Не каждый IDisposable является напрямую , используемым в операторе using.Другой пример: если у вас есть IDisposable в одном из ваших классов полей (и ваш класс "владеет" этим объектом 1 ), тогда ваш класс следует также внедрить IDisposable и очистить его одноразовые вещи во время Dispose.

Вы правы, что ваша перезапись неверна, поскольку каждый вызывающий абонент использует свою собственнуюзаблокировать объект и исключение не происходит.

См. Шаблон Dispose :

Реализуйте базовый шаблон Dispose для типов, содержащих экземпляры одноразовых типов.,Подробнее о базовом шаблоне см. В разделе Базовый шаблон удаления .


1 Благодаря комментарию Dirk для важного предостережения.Если вы находитесь в ситуации, когда вы не пытаетесь контролировать время жизни объекта, Dispose таких объектов не подходит

...