Предположим, что у меня есть следующий код:
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. Единственный раз, когда это произойдет, - если другой поток владеет блокировкой и время вызова.
Итак, существует ли такой метод? Если нет, то почему? Мне это вообще не кажется опасным, поскольку он просто говорит вам, принадлежит ли текущий поток (не другой поток) блокировке или нет.