.NET多线程和异常

Jam*_*xon 2 .net multithreading exception-handling

我写了这段代码:

        static void Main(string[] args)
    {
        Console.WriteLine("Start");

        Thread secondThread = new Thread(ThrowAnException);
        secondThread.Start();

        Console.ReadKey();
    }

    static void ThrowAnException()
    {
        throw new Exception("Second Thread Exception");
    }
}
Run Code Online (Sandbox Code Playgroud)

我的理解是,当异常发生在第二个线程上时,异常会向下移动线程的堆栈,如果未处理,子线程将以静默方式终止.我所看到的是该线程正在中断主线程并在ThrowAnException方法中打破"Exception was Unhandled".

我通过调试和没有调试来运行它,行为是相同的.

我有什么想法我做错了吗?

Han*_*ant 7

从.NET 2.0开始,未处理的异常终止程序.认为主线程被"中断"并不是正确的思维模式,整个程序都会中止并且所有线程都会死掉.它是Thread.Abort()的"粗鲁"版本,无法停止.

最后一次通过AppDomain.UnhandledException事件.它会激活你,让你有机会记录e.UnhandledException.ToString()的值,这样你就可以有机会诊断崩溃.经常被忽视,但当你的程序在野外出现时,处理崩溃是必不可少的,用户和他们的机器通常以你想象的非常令人惊讶的方式处理你的程序.

实际上,可能不会使程序崩溃,而.config文件中的属性会覆盖默认的CLR策略.但这种方式就是疯狂,在没有完成工作的情况下终止的线程只会导致程序以完全不可识别的方式行为不端.尝试在.NET 1.x中被拒绝作为一个坏主意.