Предположим, что у меня есть следующий код:
public class SomeClass()
{
private readonly object _lock = new object();
public void SomeMethodA()
{
lock (_lock)
{
SomeHelperMethod();
//do something that requires lock on _lock
}
}
public void SomeMethodB()
{
lock (_lock)
{
SomeHelperMethod();
//do something that requires lock on _lock
}
}
private void SomeHelperMethod()
{
lock (_lock)
{
//do something that requires lock on _lock
}
}
}
Блокировка внутри SomeHelperMethod
кажется избыточной и расточительной, поскольку все вызывающие абоненты уже сделали блокировку. Однако простое удаление блокировки из SomeHelperMethod
кажется опасным, поскольку мы могли бы позже реорганизовать код и забыть заблокировать объект _lock
до вызова SomeHelperMethod
.
В идеале я мог бы обойти это, утверждая, что текущий поток владеет блокировкой на _lock
внутри SomeHelperMethod
:
private void SomeHelperMethod()
{
Debug.Assert(Monitor.HasLock(_lock));
//do something that requires lock on _lock
}
Но такой метод не существует. Monitor.TryEnter
не помогает, поскольку блокировки являются повторными. Поэтому, если текущий поток уже владеет блокировкой, TryEnter
все равно будет успешным и вернет true
. Единственный раз, когда это произойдет, - если другой поток владеет блокировкой и время вызова.
Итак, существует ли такой метод? Если нет, то почему? Мне это вообще не кажется опасным, поскольку он просто говорит вам, принадлежит ли текущий поток (не другой поток) блокировке или нет.