C# 在Dispatcher.Invoke语句中引发异常时,Dispatchers未处理异常UnhandledException处理程序

C# 在Dispatcher.Invoke语句中引发异常时,Dispatchers未处理异常UnhandledException处理程序,c#,multithreading,dispatcher,C#,Multithreading,Dispatcher,我有一个关于Dispatcher.CurrentDispatcher静态属性的问题。如果我的理解是正确的,那么这个属性应该返回与线程关联的调度程序。我想如果我在同一个线程上调用两次Dispatcher.CurrentDispatcher,我会收到相同的Dispatcher实例。这是真的吗 我问这个问题是因为我遇到了以下问题。在启动(大型)应用程序时,我在主线程上注册了一个调度程序异常处理程序,如下所示: Dispatcher.CurrentDispatcher.UnhandledExceptio

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

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

Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler;
Action exception = () =>
{
    throw new Exception("myExceptionText");
};
myDispatcherInstance.Invoke(exception); 
稍后在另一个线程中,我尝试抛出如下异常:

Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler;
Action exception = () =>
{
    throw new Exception("myExceptionText");
};
myDispatcherInstance.Invoke(exception); 
其中,我已从主线程内,但从代码中的另一个但稍后执行的点,将
myDispatcherInstance
设置为
myDispatcherInstance

所以我的问题是,我从
Dispatcher.CurrentDispatcher
收到的实例是否与我最初收到的实例不同。在调试器中,我看到
myDispatcherInstance.UnhandledException
不为null,但异常不会在
myDispatcherInstance
函数中结束,而是仅在域异常处理程序中“捕获”:

AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler;

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

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

使dispatcher
未处理异常
事件触发的修复方法不是使用
调用
,而是使用
开始调用
。由于未知原因,使用dispatcher
Invoke执行的操作/委托中引发的异常将无法由dispatchers
UnhandledException
事件处理程序处理

编辑

使用
BeginInvoke
的解决方案是:

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

在调试器中,我看到myDispatcherInstance.UnhandledException不为null,但该异常不会在myDispatcherInstance中结束
您是说它不会在
if
子句中结束,而是跳过
else
子句吗?换句话说,从未到达行
myDispatcherInstance.Invoke(exception)
?我编辑了我的问题以使其更清楚。不,它从来没有在else语句中结束。dispatcher不为null,即使是
myDispatcherInstance.UnhandledException
事件属性也不为null。这只是一个没有复制代码的猜测游戏。不明显的故障模式是当您的未处理DispatcherExceptionHandler本身发生异常时。如果我的未处理DispatcherExceptionHandler本身发生异常,我想我会在堆栈跟踪中看到这一点。我尝试过调试,但没有设置
Dispatcher.CurrentDispatcher.UnhandledException+未处理的DispatcherExceptionHandler
,这意味着未设置任何dispatcher异常处理程序。然后我在调试器中看到事件函数确实为null。这使我认为Dispatcher实例是正确的,还有另一个原因,为什么它不启动Dispatcher异常处理程序函数,而是直接启动域异常处理程序。