如果您在下面运行此代码,则永远不会为全局错误处理程序调用事件处理程序。
static bool exiting = false;
static void Main(string[] args)
{
try
{
System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
demo.Start();
Console.ReadLine();
exiting = true;
}
catch (Exception ex)
{
Console.WriteLine("Caught an exception");
}
}
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Console.WriteLine("Notified of a thread exception... application is terminating.");
}
static void DemoThread()
{
Action x = () => { throw new Exception("this is simple"); };
x.BeginInvoke(null, null);
}
答案 0 :(得分:1)
您的问题是BeginInvoke()
如果您使用x();
不会有问题
简单地讲,如果您使用BeginInvoke()
调用委托,则在执行过程中抛出的任何异常都将得到处理,然后在调用EndInvoke()
时被抛出,但是您将其当作火灾而忘记了(我不确定为什么),并且您的异常未被观察到,因为它没有什么可回叫的
解决?
x.EndInvoke(x.BeginInvoke(null, null));
// or
x();
对EndInvoke
的调用在调用方上引发了异常,并且如您所愿地传播到AppDomain.CurrentDomain.UnhandledException
尽管如此,这一切似乎有点可疑,我认为您应该放弃尝试异步调用委托和总体上Thread
类,并使用任务和适当的现代BCL方法和模式进行异步< / p>
其他资源
如果被调用的方法引发异常,则该方法停止执行, 异常被传递回委托的调用者,并且 调用列表中的其余方法不会被调用。赶上 调用者中的异常不会更改此行为。
有关文档异步模式和委托