Что существует важное различие между Monitor.TryEnter (object) и Monitor.TryEnter (object, ref bool)?

Кажется, что эти фрагменты кода должны вести себя одинаково:

1: Monitor.TryEnter (object)

if (Monitor.TryEnter(lockObject))
{
    try
    {
        DoSomething();
    }
    finally
    {
        Monitor.Exit(lockObject);
    }
}

2: Monitor.TryEnter (object, ref bool) - введено в .NET 4.0

bool lockAcquired;
try
{
    Monitor.TryEnter(lockObject, ref lockAcquired);
    if (lockAcquired)
    {
        DoSomething();
    }
}
finally
{
    if (lockAcquired)
    {
        Monitor.Exit(lockObject);
    }
}

В документации MSDN я вижу перегрузку с параметром ref bool :

Если блокировка не была снята из-за было сгенерировано исключение, переменная указан для параметра lockTaken является ложным после завершения этого метода. это позволяет программе определять, в все случаи, нужно ли снять блокировку.

Но в документации также указано, что перегрузка, принимающая только параметр объекта , не генерирует никаких исключений, кроме ArgumentNullException . Таким образом, похоже, что если в фрагменте кода 1 выше возникло исключение, то это могло быть только потому, что lockObject имеет значение null , и в этом случае блокировка не была произведена ( и TryEnter в любом случае вернет false ), поэтому вызов Monitor.Exit не потребуется.

Очевидно, что они не вносили эту перегрузку без причины. Итак, для чего предназначен метод Monitor.TryEnter (object, ref bool) ?

10
задан Dan Tao 9 September 2010 в 07:55
поделиться