Мне кажется, что это нормально, за исключением того, что код выглядит очень громоздким
Я бы, вероятно, реализовал IDisposable
как:
public class WriteLock : IDisposable
{
ReaderWriterLockSlim _rwlock;
public WriteLock(ReaderWriterLockSlim rwlock )
{
_rwlock = rwlock;
_rwlock.EnterWriteLock();
}
public void Dispose()
{
_rwlock.ExitWriteLock();
}
}
Использование:
private ReaderWriterLockSlim _rwlock = new ReaderWriterLockSlim();
//...
using (new WriteLock(_rwlock)) //<-- here the constructor calls EnterWriteLock
{
_cacheEntries.Remove(name);
} //<---here Dispose method gets called automatically which calls ExitWriteLock
Аналогично, вы можете реализовать класс UpgradeableReadLock
, реализующий интерфейс IDisposable
.
Идея состоит в том, что вы можете создать экземпляр одноразового класса в конструкции using
, которая гарантирует, что в конструкторе вы входите в блокировку записи, вызывая метод EnterWriteLock()
, а когда он выходит из области видимости, метод Dispose()
вызывается автоматически (CLR), вызывая метод ExitWriteLock()
.
Обратите внимание, что он не будет располагать ReaderWriterLockSlim
объектом; он будет располагать WriteLock
объектом, который является просто оболочкой. ReaderWriterLockSlim
будет таким же в пользовательском классе.