为什么Environment.exit()不再终止程序?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

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

Exit()语句执行程序失败。在Windows窗体上,您会看到“创建窗口句柄时出错”。

启用非托管调试可以清楚地说明发生了什么。在COM模式循环正在执行,并允许待递送WM_PAINT消息。这对处置形式是致命的。

我迄今为止收集的唯一事实是:

  • 它不仅限于使用调试器运行。没有一个也是失败的。相反,WER崩溃对话框显示两次
  • 它与这个过程的微不足道没有任何关系。wow64层非常臭名昭着,但AnyCPU构建崩溃的方式相同。
  • 它与.NET版本没有任何关系,4.5和3.5以同样的方式崩溃。
  • 退出代码无关紧要。
  • 在调用Exit()之前调用Thread.Sleep()不会修复它。
  • 这发生在64位版本的Windows 8上,Windows 7似乎没有受到同样的影响。
  • 这应该是比较新的行为,我以前没有见过。我看不到通过Windows Update传送的相关更新,尽管更新历史记录在我的计算机上不再准确。
  • 这是严重的打破行为。你可以在AppDomain.UnhandledException的事件处理程序中编写这样的代码,并且它以同样的方式崩溃。

我特别感兴趣的是你可以做些什么来避免这次事故。特别是AppDomain.UnhandledException方案困扰了我; 没有很多方法来终止.NET程序。请注意,调用Application.Exit()或Form.Close()在UnhandledException的事件处理程序中无效,因此它们不是解决方法。

提问于
用户回答回答于

我就这个问题联系了微软,这似乎已经得到了回报。至少我想这样做。尽管我没有得到他们的决议,但Windows团队很难直接联系,我不得不使用中介。

通过Windows Update提供的更新解决了该问题。在崩溃之前2秒的明显延迟不再存在,强烈暗示IsWindow()死锁得到解决。该程序干净可靠地关闭。此更新安装了Windows Defender,wdboot.sys,wdfilter.sys,tcpip.sys,rpcrt4.dll,uxtheme.dll,crypt32.dll和wintrust.dll的修补程序

用户回答回答于

我不知道为什么它不工作,但我认为Environment.Exit执行挂起的终结。Environment.FailFast没有。

扫码关注云+社区