2009-10-23 79 views
9

如果在Dispatcher挂起(Dispatcher.DisableProcessing()调用)时尝试显示消息框,则会引发异常。如何检测Dispatcher.DisableProcessing是否处于活动状态?

InvalidOperationException:'调度程序处理已被暂停'(请参阅here)。

有谁知道我该如何检测Dispatcher的挂起位置(所以我知道何时拨打BeginInvoke())?

编辑1:

针对这一Application.DispatcherUnhandledException事件我想表现出一个MessageBox。但是,如果在DataBinding期间抛出此未处理的异常(即ItemsControl.ItemsSource),则Dispatcher已挂起。试图显示MessageBox然后失败。总是使用Dispatcher.BeginInvoke()可以解决问题,但除非确实需要,否则我不想这样做。

编辑2:

使用反射来实现这一点是这样的:

var dispatcherType = typeof(Dispatcher); 
var countField = dispatcherType.GetField("_disableProcessingCount", BindingFlags.Instance | BindingFlags.NonPublic); 
var count = (int)countField.GetValue(Dispatcher.CurrentDispatcher); 
var suspended = count > 0; 
+0

我建议你在这里提供更多的细节,从而使问题完全就地。 – 2009-10-23 07:32:58

回答

0

没有公共接口有那么你就没有合法的方式来表达不管是暂停与否。你仍然可以使用反射,但一般来说这表明你正在做一些完全错误的事情。

如果您可以给我们更多的细节,我们可以建议适当的解决方案?

+1

对Application.DispatcherUnhandledException事件的反应我试图显示一个MessageBox。 但是,如果在DataBinding(即ItemsControl.ItemsSource)期间抛出此未处理的异常,Dispatcher将被挂起。试图显示一个MessageBox然后失败。始终使用Dispatcher.BeginInvoke()解决了这个问题,但除非确实需要,否则我不想这样做。 – Muri 2009-10-23 10:02:51

-1

试试这个:

if(currentDispatcher.Thread.ThreadState == System.Threading.ThreadState.Suspended) 
{ 

} 
+0

这不起作用。在DisableProcessing时间段内,threadState仍然是“正在运行”。 – 2014-01-24 18:39:50

相关问题