2009-10-23 135 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

相關問題