14

Dispatcher如果在挂起(Dispatcher.DisableProcessing()调用)的情况下尝试显示消息框,则会引发异常。

InvalidOperationException:“调度程序处理已暂停”(请参见此处)。

有谁知道我怎样才能检测到在哪里Dispatcher被暂停(所以我知道什么时候打电话BeginInvoke())?

编辑1:

作为对 Application.DispatcherUnhandledException 事件的反应,我试图显示一个 MessageBox。但是,如果在 DataBinding(即ItemsControl.ItemsSource)期间抛出了这个未处理的异常,则该异常被Dispatcher挂起。试图显示 a MessageBoxthen 失败。总是使用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;
4

2 回答 2

0

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

如果您能给我们更多详细信息,我们可以建议适当的解决方案吗?

于 2009-10-23T07:55:33.337 回答
-4

尝试这个:

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

}
于 2013-03-19T12:32:08.597 回答