gpt4 book ai didi

c# - 最后阻止不运行?

转载 作者:IT王子 更新时间:2023-10-29 04:47:07 27 4
gpt4 key购买 nike

好吧,这是一个奇怪的问题,我希望有人能解释一下。我有以下代码:

static void Main(string[] args)
{
try
{
Console.WriteLine("in try");
throw new EncoderFallbackException();
}
catch (Exception)
{
Console.WriteLine("in Catch");
throw new AbandonedMutexException();
}
finally
{
Console.WriteLine("in Finally");
Console.ReadLine();
}
}

现在,当我将其编译为目标 3.5(2.0 CLR) 时,它会弹出一个窗口,提示“XXX 已停止工作”。如果我现在单击取消 按钮,它将运行 finally,如果我等到它完成查找并单击 关闭程序 按钮,它也将运行 finally .

现在有趣且令人困惑的是,如果我针对 4.0 编译执行相同的操作 单击 Cancel 按钮将运行 finally block 并单击 Close Program 按钮将不会。

我的问题是:为什么在点击关闭程序按钮时最终运行在 2.0 而不是 4.0?这有什么影响?

编辑:我在 Windows 7 32 位上以 Release模式(内置 Release模式)的命令提示符运行它。错误消息:下面的第一个结果是在 3.5 上运行,在 Windows 查找问题后关闭,第二个是当我在 4.0 上运行它并执行相同的操作时。

alt text

最佳答案

我现在能够重现该行为(当我第一次阅读它时,我没有从您的问题中得到确切的步骤)。

我可以观察到的一个区别是 .NET 运行时处理未处理异常的方式。 CLR 2.0 运行一个名为 Microsoft .NET Error Reporting Shim (dw20.exe) 的帮助程序,而 CLR 4.0 启动 Windows Error Reporting (WerFault.exe).

我假设两者在终止崩溃过程方面有不同的行为。 WerFault.exe 显然会立即终止 .NET 进程,而 .NET 错误报告 Shim 会以某种方式关闭应用程序,以便 finally block 仍然被执行。

另请查看事件查看器:WerFault 记录一个应用程序错误,通知崩溃的进程已终止:

Application: ConsoleApplication1.exeFramework Version: v4.0.30319Description: The process was terminated due to an unhandled exception.Exception Info: System.Threading.AbandonedMutexExceptionStack:   at Program.Main(System.String[])

但是,dw20.exe 仅将事件 ID 为 1001 的信息项记录到事件日志中,并且不会终止进程。

关于c# - 最后阻止不运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4193493/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com