Подтвердить что ты не робот

Попробуйте и заблокируйте вопрос

У меня вопрос.. это нормально, если у меня есть что-то вроде этого:

try 
{ 
    lock(programLock) 
    {
         //some stuff 1
    }
}
catch(Exception ex) { //stuff 2 }

Мне интересно, если "some stuff 1" вызывает исключение, остается ли programLock заблокировано?

4b9b3361

Ответ 1

Нет, блокировка будет отпущена, блокировка примерно эквивалентна этому:

try
{
    Monitor.Enter(programLock);
    // some stuff 1
}
finally
{
    Monitor.Exit(programLock);
}

(Значение, если выбрано исключение, Monitor.Exit будет вызываться автоматически при выходе из области действия оператора блокировки)

Ответ 2

Lock() - это не что иное, как

try
{
   Monitor.Enter(...);
}
finally
{
   Monitor.Exit(....);
}

Итак, он уже позаботится об этом.

Ответ 3

Из msdn documentation

"... lock или SyncLock гарантирует, что основной монитор выпущен, даже если защищенный код исключение".

Примечание. Вы можете создать свои собственные блоки исключений для произвольных действий с помощью используя блоки,.net-версию RAII.

Ответ 4

Нет. оставляя фиксаторы всегда разблокированными.