Комментарий Ганса Пассанта, конечно, правильный.Если Monitor.Enter
бросает до блокировки, то вы не хотите, чтобы наконец-то запустился.Если он выдает после блокировки, и после , попытка вводится, тогда блокировка снимается.(Подробнее об этом позже.) Но если бросок произойдет после того, как будет снята блокировка, но за до попытка введена, блокировка никогда не будет очищена.
Эторедкая, но возможная ситуация.
В C # 4 мы изменили кодовый код оператора блокировки, чтобы ввод монитора был внутри попытки.Это гарантирует, что блокировка всегда снимается, если что-то срабатывает после того, как блокировка снята.Тем не менее, обратите внимание, что это все равно может быть неправильно .Если что-то выбрасывается после взятия блокировки, то , независимо от неатомарной мутации, которую защищает блокировка, может быть наполовину завершено , и тогда блок finally разблокирует блокировку и разрешит доступ к несогласованному состоянию!Фундаментальная проблема здесь заключается в том, что вы не должны бросать блокировку в первую очередь.
См. мою статью о проблеме для дальнейшего обсуждения.