Здравствуйте, мне нужно использовать writereaderlock в моем методе. Я хочу знать, как правильно это использовать.
У меня есть словарь ObjectA
public class ObjectA
{
public ReaderWriterLock RWL {get;set;}
public ObjectB obj {get;set;}
public ObjectA()
{
RWL = new ReaderWriterLock();
}
}
public class ObjectB
{
int TTL {get;set;}
string Value {get;set;}
}
В моем методе я использую словарь ObjectA, ключ - Guid, поэтому предположим, что когда я вызываю dict [guid], он всегда возвращает экземпляр объекта ObjectA (для примера)
public foo()
{
ObjecA objA = dict[guid];
objA.RWL.AcquireReaderLock(500);
if(objA.obj.TTL<=0)
{
objA.obj.RWL.AcquireWriterLock(1000);
objA.obj.Value = DateTime.Now().ToString();
objA.obj.RWL.ReleaseWriterLock();
}else{
int ttl = objA.obj.TTL;
Interlocked.Decrement(ref ttl);
}
objA.RWL.ReleaseReaderLock();
}
Я действительно не уверен в том, что я использую читателя и писателя там, как мне нужно было использовать блокировку писателя с условной проверкой?
В этом коде есть много проблем, включая:
Interlocked.Decrement(ref objA.obj.TTL)
как это сделать правильно.Также возможно стоит подумать, действительно ли вам нужно использовать блокировки чтения/записи вместо того, чтобы использовать что-то более простое, чем оператор lock{}
. Правильно блокировать блокировки чтения/записи и избегать взаимоблокировок сложно даже для разработчиков, которые хорошо знают эти API и концепции, и даже тогда они обычно резервируют их использование только для самых критически важных мест (1000 + в секунду). Другими словами, вам может быть лучше начать с более простого подхода с использованием lock{}
и вернуться к использованию ReaderWriterLockSlim
, если производительность неприемлема.
В качестве отправной точки я бы предложил добавить дополнительную информацию к вашему вопросу:
Я гарантирую, что если вы включите эту дополнительную информацию в свой вопрос, вы получите лучшие ответы, которые помогут вам справиться с любыми остальными проблемами с кодом.: -)