Чтобы синхронизировать доступ к моим свойствам, я использую класс ReaderWriterLockSlim. Я использую следующий код для доступа к моим свойствам поточно-безопасным способом.
public class SomeClass
{
public readonly ReaderWriterLockSlim SyncObj = new ReaderWriterLockSlim();
public string AProperty
{
get
{
if (SyncObj.IsReadLockHeld)
return ComplexGetterMethod();
SyncObj.EnterReadLock();
try
{
return ComplexGetterMethod();
}
finally
{
SyncObj.ExitReadLock();
}
}
set
{
if (SyncObj.IsWriteLockHeld)
ComplexSetterMethod(value);
else
{
SyncObj.EnterWriteLock();
ComplexSetterMethod(value);
SyncObj.ExitWriteLock();
}
}
}
// more properties here ...
private string ComplexGetterMethod()
{
// This method is not thread-safe and reads
// multiple values, calculates stuff, ect.
}
private void ComplexSetterMethod(string newValue)
{
// This method is not thread-safe and reads
// and writes multiple values.
}
}
// =====================================
public static SomeClass AClass = new SomeClass();
public void SomeMultiThreadFunction()
{
...
// access with locking from within the setter
AClass.AProperty = "new value";
...
// locking from outside of the class to increase performance
AClass.SyncObj.EnterWriteLock();
AClass.AProperty = "new value 2";
AClass.AnotherProperty = "...";
...
AClass.SyncObj.ExitWriteLock();
...
}
Чтобы избежать ненужных блокировок всякий раз, когда я получаю или устанавливаю несколько свойств, я однажды опубликовал объект ReaderWriterLockSlim
-Object и заблокировал его вне класса каждый раз, когда я собираюсь получить или установить набор свойств. Для этого мои методы getter и setter проверяют, была ли блокировка получена с использованием свойства IsReadLockHeld
и свойства IsWriteLockHeld
ReaderWriterLockSlim
. Это отлично работает и увеличило производительность моего кода.
До сих пор так хорошо, но когда я перечитывал документацию о IsReadLockHeld
и IsWriteLockHeld
, я заметил форму замечаний Microsoft:
Это свойство предназначено для использования в утверждениях или для другой отладки цели. Не используйте его для управления потоком выполнения программы.
Мой вопрос: Есть ли причина, по которой я не должен использовать IsReadLockHeld/IsWriteLockHeld
для этой цели? Что-то не так с моим кодом? Все работает так, как ожидалось, и намного быстрее, чем использование рекурсивных замков (LockRecursionPolicy.SupportsRecursion
).
Чтобы прояснить это: это минимальный пример. Я не хочу знать, нужна ли сама блокировка или ее можно удалить или добиться другим способом. Я просто хочу знать, почему я не должен использовать IsReadLockHeld
/IsWriteLockHeld
для управления потоком программы, как указано в документации.