Кажется, что эти фрагменты кода должны вести себя одинаково:
if (Monitor.TryEnter(lockObject))
{
try
{
DoSomething();
}
finally
{
Monitor.Exit(lockObject);
}
}
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)
?