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

时间:2015-11-30 14:49:11

标签: c# multithreading dispatcher

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

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

Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler;

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

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

我已经从主线程中将myDispatcherInstance设置为myDispatcherInstance,但是从代码中的另一个但稍后执行的点设置。{/ p>

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

AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler;

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

1 个答案:

答案 0 :(得分:1)

经过一番研究后,我发现实例确实非常相似。因此,当您在同一个线程上访问Dispatcher.CurrentDispatcher时,您始终会获得相同的实例。

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

修改

BeginInvoke的解决方案是:

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