从C#中的线程启动的线程不会引发未处理的期望args

时间:2018-12-06 04:14:43

标签: c# .net

如果您在下面运行此代码,则永远不会为全局错误处理程序调用事件处理程序。

static bool exiting = false;

static void Main(string[] args)
{
    try
    {
        System.Threading.Thread demo = new System.Threading.Thread(DemoThread);
        AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        demo.Start();
        Console.ReadLine();
        exiting = true;
    }
    catch (Exception ex)
    {
        Console.WriteLine("Caught an exception");
    }
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    Console.WriteLine("Notified of a thread exception... application is terminating.");
}

static void DemoThread()
{
    Action x = () => { throw new Exception("this is simple"); };
    x.BeginInvoke(null, null);
}

1 个答案:

答案 0 :(得分:1)

您的问题是BeginInvoke()

如果您使用x();不会有问题

简单地讲,如果您使用BeginInvoke()调用委托,则在执行过程中抛出的任何异常都将得到处理,然后在调用EndInvoke()时被抛出,但是您将其当作火灾而忘记了(我不确定为什么),并且您的异常未被观察到,因为它没有什么可回叫的

解决?

x.EndInvoke(x.BeginInvoke(null, null));

// or

x();

EndInvoke的调用在调用方上引发了异常,并且如您所愿地传播到AppDomain.CurrentDomain.UnhandledException

尽管如此,这一切似乎有点可疑,我认为您应该放弃尝试异步调用委托和总体上Thread类,并使用任务和适当的现代BCL方法和模式进行异步< / p>


其他资源

Delegate Class

  

如果被调用的方法引发异常,则该方法停止执行,   异常被传递回委托的调用者,并且   调用列表中的其余方法不会被调用。赶上   调用者中的异常不会更改此行为。

有关文档异步模式和委托

Calling Synchronous Methods Asynchronously