Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ThreadExceptionEventHandler和调用委托_C#_Winforms_Multithreading_Exception Handling - Fatal编程技术网

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();
    }));
}