Почему Environment.Exit () больше не завершает программу?

Это то, что я обнаружил всего несколько дней назад, я получил подтверждение, что это не такт только моя машина ограниченаэтот вопрос.

Самый простой способ воспроизвести его - запустить приложение Windows Forms, добавить кнопку и написать следующий код:

    private void button1_Click(object sender, EventArgs e) {
        MessageBox.Show("yada");
        Environment.Exit(1);         // Kaboom!
    }

Программа не работаетпосле оператор Exit () выполняется. На Windows Forms вы получаете "Ошибка создания дескриптора окна ".

Включение неуправляемой отладки проясняет, чтопродолжаетсяCOM Модальный цикл выполняется и позволяет доставлять сообщение WM_PAINT. Тот'Смертельно на расправленной форме.

Единственные факты, которые ясобрались так далеко:

Это н'я просто ограничен работой с отладчиком. Это также терпит неудачу без одного. Довольно плохо, также, появляется диалоговое окно сбоя WERдважды.Это нене имеет ничего общего с разрядностью процесса. Слой wow64 довольно печально известен, но сборка AnyCPU происходит так же.Это нене имеет ничего общего с .NET-версией, 4.5 и 3.5 аварийно завершают работу одинаково.Код выхода нене имеет значения.Вызов Thread.Sleep () перед вызовом Exit () неэто исправить.Это происходит в 64-разрядной версии Windows 8, и Windows 7, похоже, не подвержена такому же влиянию.Это должно быть относительно новое поведение, я не имеюЯ видел это раньше. Я не вижу соответствующих обновлений, доставленных черезЦентр обновления Windows, хотя история обновлений неТочнее на моей машине.Это грубо нарушающее поведение. Вы бы написали такой код в обработчике событий для AppDomain.UnhandledException, и он вылетает так же.

Меня особенно интересует, что вы могли бы сделать, чтобы избежать этой аварии. В частности, сценарий AppDomain.UnhandledException ставит меня в тупик; Есть не так много способов завершить программу .NET. Обратите внимание, что вызов Application.Exit () или Form.Close () недопустим в обработчике событий для UnhandledException, поэтому они не являются обходными путями.

ОБНОВЛЕНИЕ: Mehrdad указал, что поток финализатора мог быть частью проблемы. Я думаю я'Я вижу это, а также вижу некоторые свидетельства для 2-секундного тайм-аута, что CLR дает потоку финализатора завершить выполнение.

Финализатор находится внутри NativeWindow.ForceExitMessageLoop (). Там'там есть функция Win32 IsWindow (), которая примерно соответствует расположению кода, смещение 0x3c при просмотре машинного кода в 32-битном режиме. Похоже, что IsWindow () блокируется. Я не могу получить хорошую трассировку стека для внутренних устройств, однако, отладчик думает, чтоP / Invoke звонок только что вернулся. Это сложно объяснить. Если вы можете получить лучшую трассировку стека, то яЯ хотел бы увидеть это. Мой:

System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.ForceExitMessageLoop() + 0x3c bytes
System.Windows.Forms.dll!System.Windows.Forms.NativeWindow.Finalize() + 0x16 bytes
[Native to Managed Transition]
kernel32.dll!@BaseThreadInitThunk@12()  + 0xe bytes
ntdll.dll!___RtlUserThreadStart@8()  + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8()  + 0x1b bytes

Ничего, кроме вызова ForceExitMessageLoop, неуправляемый отладчик включен.

Ответы на вопрос(4)

Ваш ответ на вопрос