スレッド セーフのために ReaderWriterLockSlim を利用する多くのプロパティを実装しようとしています。したがって、ほとんどの場合と同様に、すべてのプロパティで次のような結果になります。
public string Name
{
get
{
rwLock.EnterReadLock();
try {
return name;
}
finally {
rwLock.ExitReadLock();
}
}
set
{
rwLock.EnterWriteLock();
try {
name = value;
}
finally {
rwLock.ExitWriteLock();
}
}
}
これは 10 個のプロパティで非常に冗長で反復的な感じがするので、より DRY な実装を探しています。
明らかな解決策は、破棄時にロックを解放し、スレッド セーフな操作を using ステートメント内に配置できるようにするクラスにラップすることです。これと他のいくつかの情報源によると、明らかにこれはあまり安全ではありません。
そこで、ラムダ式と匿名メソッドを使用して見栄えの良いソリューションを考え出そうとしました。
private TResult ThreadSafeRead<TResult>(Func<TResult> value)
{
rwLock.EnterReadLock();
try {
return value();
}
finally {
rwLock.ExitReadLock();
}
}
private void ThreadSafeWrite(Action value)
{
rwLock.EnterWriteLock();
try {
value();
}
finally {
rwLock.ExitWriteLock();
}
}
public string Name
{
get { return ThreadSafeRead(() => name); }
set { ThreadSafeWrite(() => { name = value; }); }
}
これにより、私を悩ませていた繰り返しコードがなくなりましたが、元の詳細な実装と同じくらいスレッドセーフかどうかはわかりません。
これが生成する MSIL とマルチスレッド理論をよりよく理解している人は、私の実装が安全かどうかを教えてくれますか?