问题描述
这是64位OS平台上的已知问题。原因是64位OS内核不允许通过内核模式堆栈进行用户模式异常。异常被操作系统缓慢吞噬。这是在Formload处理程序中发生的,因为它是在OS回调中调用的。32位操作系统不会执行此操作,因此不会在那里复制。
操作系统团队正在调查相关问题。同时,您必须解决此问题。启用“在第一次机会异常时停止”将使调试器在这种情况下停止。但这确实会使调试器非常频繁地停止,因此您可能只想在发现问题时才这样做。
链接的错误报告的最新更新时间为2008年2月,但未显示此后发生的情况。
在这里,我可以在32位系统上重现大多数海报的行为,并且可以在64位(Vista SP2、3.5SP1 Framework)工作PC上重现OP的行为。
解决方法
在winforms应用中,在窗体的Load事件中,添加以下行:
throw new Exception();
并运行该应用程序。它运行没有问题。这称为静默故障,您可以尝试在前后添加消息框,并且您很快就会发现,throw语句只是从Load事件中退出,而不是使应用程序崩溃。
我敢肯定没有必要解释这是多么的丑陋和危险。
尽管如此,我仍想知道这种可怕行为背后的原因(可能是历史原因)。我确定这不是设计决定,可能不是选择还是懒惰。有人知道吗
如果有人可以将我指向可能也会导致严重失败的事件列表,我们将非常高兴。
这是我的代码的一部分-我不知道它可能有什么帮助-但是,这里是:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Form f = new Form();
f.Load += new EventHandler((x,y) => { throw new Exception(); });
Application.Run(f);
}
}
}
编辑 似乎并不是每个人都发生过。我使用:fw 3.5,winforms,vs 2008,vista
x64,winforms的新清洁项目,以及上面提到的代码。