在 Dispatcher.Invoke 语句中抛出异常时,Dispatchers UnhandledException 处理程序未处理异常

Exception not handled by Dispatchers UnhandledException handler when throwing exception in Dispatcher.Invoke statement

我有一个关于 Dispatcher.CurrentDispatcher 静态 属性 的问题。如果我的理解是正确的,这个 属性 应该 return 与线程关联的调度程序。我想如果我在同一个线程上调用 Dispatcher.CurrentDispatcher 两次,我会收到同一个 Dispatcher 实例。这是真的吗?

我问这个问题是因为我遇到了以下问题。在我的(巨大的)应用程序启动时,我在主线程上注册了一个 Dispatcher 异常处理程序,如下所示:

Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler;

后来在另一个线程上我试图抛出这样的异常:

Action exception = () =>
{
    throw new Exception("myExceptionText");
};
myDispatcherInstance.Invoke(exception); 

我从主线程中将 myDispatcherInstance 设置为 myDispatcherInstance,但从代码中的另一个但稍后执行的点开始。

所以我的问题是我从 Dispatcher.CurrentDispatcher 收到的实例是否与我最初收到的实例不同。在调试器中,我看到 myDispatcherInstance.UnhandledException 不为空,但异常并没有在 myDispatcherInstance 函数中结束,而是在域异常处理程序中仅 'caught':

AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler;

或者可能 Dispatcher.CurrentDispatcher.UnhandledExceptionhandler 是正确的,但由于另一个原因触发了域异常处理程序,并且在这种情况下简单的调度程序异常处理程序不会触发?如果有,原因是什么?

经过一番研究,我发现实例确实是一样的。因此,在同一线程上访问 Dispatcher.CurrentDispatcher 时,您总是会得到相同的实例。

使调度程序 UnhandledException 事件触发的修复不是使用 Invoke,而是 BeginInvoke。由于对我来说还未知的原因,在使用调度程序 Invoke 执行的 action/delegate 中抛出的异常将无法由调度程序 UnhandledException 事件处理程序处理。

编辑

BeginInvoke的解是:

Action exception = () =>
{
    throw new Exception("myExceptionText");
};
myDispatcherInstance.BeginInvoke(exception);