使用UnhandledExceptionHandler防止崩溃

时间:2019-03-09 07:32:21

标签: .net vb.net multithreading unhandled-exception

前言:我完全知道这样做有多糟糕,我只是好奇它为什么起作用

我在浏览与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可以防止应用崩溃?

0 个答案:

没有答案