C# ThreadExceptionEventHandler和调用委托
如果我将C# ThreadExceptionEventHandler和调用委托,c#,winforms,multithreading,exception-handling,C#,Winforms,Multithreading,Exception Handling,如果我将ThreadExceptionEventHandler分配给Application.ThreadException,为什么在我使用主应用程序线程上的控件调用委托方法时,该委托引发的任何异常都不会触发事件处理程序 i、 e 这里的上下文是,我有一个后台线程,它从一个窗体启动,该窗体正在抛出一个终止应用程序的未处理异常。我知道这个线程将是不可靠的,因为它依赖于网络连接,因此在任何时候都可能被终止,但我只是想知道为什么这个场景没有像我预期的那样进行?使用AppDomain.CurrentDom
ThreadExceptionEventHandler
分配给Application.ThreadException
,为什么在我使用主应用程序线程上的控件调用委托方法时,该委托引发的任何异常都不会触发事件处理程序
i、 e
这里的上下文是,我有一个后台线程,它从一个窗体启动,该窗体正在抛出一个终止应用程序的未处理异常。我知道这个线程将是不可靠的,因为它依赖于网络连接,因此在任何时候都可能被终止,但我只是想知道为什么这个场景没有像我预期的那样进行?使用
AppDomain.CurrentDomain.UnhandledException
,捕获非Windows窗体创建和拥有的线程中发生的异常
您应该明确了解以澄清此问题尽管这确实会引发异常,但我似乎无法在此时对异常进行任何处理,除非记录异常,然后应用程序退出。因为我不太关心这个后台进程的失败,所以我不想扼杀整个进程。在这种情况下,wrap方法在thread-into
try-catch
block中执行,这是一个有趣的问题。您可能认为会调用线程异常事件处理程序,因为异常发生在UI线程上。也许您需要设置未处理的异常模式?似乎没有帮助-不过我会将其添加到示例代码中。
static void Main()
{
...
Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Application.Run(new Form1());
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
Console.Error.Write("A thread exception occurred!");
}
...
private void Form1_Load(object sender, EventArgs e)
{
Thread syncThread = new Thread(new ThreadStart(this.ThrowException));
syncThread.Start();
}
private void ThrowException()
{
button1.Invoke(new MethodInvoker(delegate
{
// Not handled by ThreadExceptionEventHandler?
throw new Exception();
}));
}