Заблокированный объект остается заблокированным, если исключение происходит в нем?

В приложении поточной обработки c#, если я должен был заблокировать объект, позволяют нам сказать, что очередь, и если исключение происходит, будет объектное заблокированное пребывание? Вот псевдокод:

int ii;
lock(MyQueue)
{
   MyClass LclClass = (MyClass)MyQueue.Dequeue();
   try
   {
      ii = int.parse(LclClass.SomeString);
   }
   catch
   {
     MessageBox.Show("Error parsing string");
   }
}

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

77
задан user 16 August 2012 в 09:16
поделиться

3 ответа

Сначала; Вы рассмотрели TryParse?

in li;
if(int.TryParse(LclClass.SomeString, out li)) {
    // li is now assigned
} else {
    // input string is dodgy
}

блокировка будет выпущена по 2 причинам; во-первых, lock по существу:

Monitor.Enter(lockObj);
try {
  // ...
} finally {
    Monitor.Exit(lockObj);
}
116-секундный; Вы ловите и не повторно бросаете внутреннее исключение, таким образом, lock никогда на самом деле видит исключение. Конечно, Вы держите блокировку на время MessageBox, который мог бы быть проблемой.

, Таким образом, это будет выпущено во всех кроме большинства фатальных катастрофических неисправимых исключений.

83
ответ дан Kjartan 24 November 2019 в 10:46
поделиться

Только добавить немного к превосходному ответу Marc.

Такие ситуации являются самой причиной существования lock ключевое слово. Это помогает разработчикам удостовериться, что блокировка выпущена в finally блок.

, Если Вы вынуждены использовать Monitor.Enter / Exit, например, поддерживать тайм-аут, необходимо удостовериться, что поместили вызов в Monitor.Exit в finally блок для обеспечения надлежащего выпуска блокировки в случае исключения.

4
ответ дан Brian Rasmussen 24 November 2019 в 10:46
поделиться

«Оператор блокировки компилируется для вызова Monitor.Enter, а затем для блока try… finally. В блоке finally вызывается Monitor.Exit.

Генерация кода JIT как для x86, так и для x64 гарантирует, что прерывание потока не может произойти между вызовом Monitor.Enter и блоком try, который следует сразу за ним »

Взято из: Этот сайт

13
ответ дан 24 November 2019 в 10:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: