Предисловие: я прекрасно знаю, насколько плохо это делается, мне просто интересно, почему это работает
Я видел этот фрагмент кода при просмотре вопросов, связанных с 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
предотвращает сбой приложения?