パフォーマンス上の問題により、ReaderWriterLock
をReaderWriterLockSlim
に置き換えました。 RWLを使用しているときに正しく機能していたコードが原因で、問題が発生しています。ReaderWriterLockをReaderWriterLockSLimに置き換える - 問題
あなたが見ることができるように、時にはMethodA
は(書き込みロックを取得する)(ロックを読んを取得)別のメソッドを呼び出します。 2番目の方法は、別の場所から呼び出されるため、必ずしもロックの衝突があるとは限りません。これまでは、AcquiringReadロックで問題が発生していませんでした。
"if IsRWheld"を配置する以外の解決策はありますか? MethodAからMethodXへの呼び出しは、ロックの再帰的な使用としてそれを修飾する
class Avacado
{
ReaderWriterLockSlim _lock = new ReaderWriterLockSlim();
void MethodA()
{
_lock.TryEnterWriteLock(-1);
LockedList.Add(someItem)
var result = MethodX();
_lock.ExitWriteLock();
}
object MethodX()
{
//if called from MethodA, it will throw an exception
_lock.TryEnterReadLock(-1);
//...some stuff with LockedList...
var result = LockList.Something();
_lock.ExitReadLock();
return result;
}
}