DispatchersUnhandledException处理程序在Dispatcher.Invoke语句中引发异常时未

本文关键字:异常 语句 程序 处理 Dispatcher Invoke DispatchersUnhandledException | 更新日期: 2023-09-27 18:25:01

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

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

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是正确的,但由于另一个原因,域异常处理程序被触发,而在这种情况下,调度程序异常处理程序simple不会触发?如果是,原因是什么?

DispatchersUnhandledException处理程序在Dispatcher.Invoke语句中引发异常时未

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

使调度程序UnhandledException事件激发的修复方法不是使用Invoke而是使用BeginInvoke。由于一个未知的原因,在使用调度器Invoke执行的操作/委托中引发的异常将无法由调度器UnhandledException事件处理程序处理。

编辑

BeginInvoke的解决方案是:

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