Замечу, что никто не упомянул в своих ответах на этот старый вопрос, что снятие блокировки исключения - невероятно опасная вещь. Да, операторы блокировки в C # имеют семантику «finally»; когда элемент управления выходит из замка нормально или ненормально, замок снимается. Вы все говорите об этом так, будто это хорошо, но это плохо! Правильный поступок, если у вас есть заблокированная область, которая вызывает необработанное исключение, - это немедленно завершить зараженный процесс до того, как он уничтожит больше пользовательских данных , а не освобождать блокировку и продолжать работу. .
Посмотрите на это так: представьте, что у вас есть ванная с замком на двери и очередь людей, ожидающих снаружи. Бомба в ванной взорвалась, убив человека там. Ваш вопрос: «Будет ли в этой ситуации замок автоматически разблокирован, чтобы следующий человек мог попасть в ванную комнату?» Да, это будет. Это нехорошо. Там просто взорвалась бомба и кого-то убили! Водопровод, вероятно, разрушен, дом больше не является прочным, и там может быть еще одна бомба . Правильнее всего вывести всех как можно быстрее и снести весь дом.
Я имею в виду, подумайте над этим: если вы заблокировали область кода, чтобы читать из структуры данных без ее изменения в другом потоке, и что-то в этой структуре данных вызывало исключение, велики шансы, что это потому, что структура данных коррумпирован . Пользовательские данные теперь испорчены; вы не хотите пытаться сохранить данные пользователя на этом этапе, потому что затем вы сохраняете поврежденные данные. Просто прекратите процесс.
Если вы заблокировали область кода, чтобы выполнить мутацию без одновременного чтения состояния другим потоком, и мутация выдает ошибку, то, если данные не были повреждены раньше, это точно теперь . Это именно тот сценарий, от которого должна защищать блокировка . Теперь коду, который ожидает чтения этого состояния, немедленно будет предоставлен доступ к поврежденному состоянию и, возможно, произойдет сбой. Опять же, правильное решение - прекратить процесс.
Как ни крути, исключение внутри блокировки - плохая новость . Правильный вопрос - не "будет ли моя блокировка очищена в случае исключения?" Правильный вопрос, который следует задать: «Как мне гарантировать, что внутри блокировки никогда не будет исключения? И если есть, то как мне структурировать мою программу так, чтобы мутации возвращались к предыдущему хорошему состоянию?»