前言:我完全知道这样做有多糟糕,我只是好奇它为什么起作用
我在浏览与UnhandledException
相关的问题时看到了这段代码,并且想知道为什么在处理程序中调用Thread.CurrentThread.Join()
可以防止应用崩溃,以及线程本身调用Join()
的原因在这种情况下甚至意味着什么?
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException
Public Sub UnhandledException(ByVal sender As Object, ByVal e As UnhandledExceptionEventArgs)
Console.WriteLine($"[ERROR] {DirectCast(e.ExceptionObject, Exception).Message}")
'Thread.CurrentThread.IsBackground = True
Thread.CurrentThread.Join()
End Sub
我还注意到,尽管此处理程序确实可以防止崩溃的应用程序,但似乎使线程处于某种未知/正在运行的状态(我的意思是,此时一切都处于未定义状态;但仍然如此),这意味着对Thread.CurrentThread.IsBackground = True
允许应用程序在主线程完成时退出。
Public Sub Main()
Application.EnableVisualStyles()
Application.SetCompatibleTextRenderingDefault(False)
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException)
AddHandler AppDomain.CurrentDomain.UnhandledException, AddressOf UnhandledException
Application.Run(New Form1) ' Form1 has a button that starts a thread which throws an exception
' This is only reached when Form1 is closed, but if there is
' no Thread.CurrentThread.IsBackground = True the app keeps running
' in the background because the other threads are still running or in
' an alive-ish state
End Sub
tl; dr :为什么在Thread.CurrentThread.Join()
中调用UnhandledExceptionHandler
可以防止应用崩溃?