Проверка, имеет ли текущий поток блокировку - PullRequest
17 голосов
/ 30 января 2009

Предположим, у меня есть следующий код:

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. Единственный раз, когда он потерпит неудачу, это если другой поток владеет блокировкой и время ожидания вызова истекло.

Так существует ли такой метод? Если нет, то почему? Мне это вообще не кажется опасным, поскольку просто говорит вам, имеет ли текущий поток (не другой поток) блокировку или нет.

Ответы [ 11 ]

0 голосов
/ 30 января 2009

Хотелось бы, чтобы это было возможно, это сделало бы мой код намного, намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...