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