2015-11-30 30 views
2

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

我问这个问题,因为我遇到以下问题。在我的(巨)应用程序的启动我注册在主线程分派器异常处理程序是这样的:

Dispatcher.CurrentDispatcher.UnhandledException += UnhandledDispatcherExceptionHandler; 

在不同的线程我试图抛出一个异常,这样以后:

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

我在主线程中设置了myDispatcherInstancemyDispatcherInstance,但是从另一个但稍后在代码中执行的点。

所以我的问题是,我从Dispatcher.CurrentDispatcher收到的实例是否可能与我首先收到的实例不同。在调试器中,我看到myDispatcherInstance.UnhandledException不为空,但仍然异常不会在myDispatcherInstance功能结束而只是被“抓”域中异常处理程序:

AppDomain.CurrentDomain.UnhandledException += UnhandledDomainExceptionHandler; 

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

+0

'在我看到myDispatcherInstance.UnhandledException不为空,但仍然异常不会在myDispatcherInstance结束调试器'你说它不会在'if'子句中结束,而是跳到'else'子句中?换句话说,'myDispatcherInstance.Invoke(exception)'行永远不会到达? –

+1

我编辑了我的问题,使其更清楚。不,它永远不会在else语句中结束。调度程序不为null,即使'myDispatcherInstance.UnhandledException'事件属性不为null。 – Sjoerd222888

+1

这只是一个没有repro代码的猜谜游戏。非显而易见的失败模式是当您的UnhandledDispatcherExceptionHandler本身在异常时崩溃。 –

回答

1

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

修复程序使调度器UnhandledException事件失火不是使用Invoke而是使用BeginInvoke。对于尚未知道的原因,由调度员UnhandledException事件处理程序不能处理由调度程序Invoke执行的操作/委托中抛出的异常。

编辑

BeginInvoke解决的办法是:

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