最近ReaderWriterLockSlim
、複数のスレッド間で共有される複数のリソースへのアクセスを同期するために使用する必要がありました。ReaderWriterLockSlim
やっていくうちに、特に複数の場所で使わなければならない場合は使いにくいと感じました。ブロックが必要でtry...finally
、ロックを開閉することを忘れないでください。多くの場合、書き込みロックを閉じるのではなく、書き込みロックを開き、読み取りロックを閉じていることにも気づきました。そこで、もっと簡単に使える方法を考えてみましたReaderWriterLockSlim
。これは私が得た場所です
class Locked<T>
{
private T _resource;
private ReaderWriterLockSlim _lock;
public Locked(T resource)
{
_resource = resource;
_lock = new ReaderWriterLockSlim();
}
public void Read(Action<T> ReadAction)
{
try
{
_lock.EnterReadLock();
ReadAction(_resource);
}
finally
{
_lock.ExitReadLock();
}
}
public void Write(Action<T> WriteAction)
{
try
{
_lock.EnterWriteLock();
WriteAction(_resource);
}
finally
{
_lock.ExitWriteLock();
}
}
}
たとえば、へのアクセスを同期する必要がある場合、List<string>
これは上記のクラスを使用して行う方法です
public class Demo
{
private Locked<List<string>> _listOfString;
public Demo()
{
_listOfString = new Locked<List<string>>(new List<string>());
}
public void writeMethod(string value)
{
_listOfString.Write(list =>
{
list.Add(value);
});
}
public string readMethod(int index)
{
string value = null;
_listOfString.Read(list =>
{
value = list[index];
});
return value;
}
}
このアプローチの方が優れていると思いますか? 欠点や欠陥はありますか。