2009-10-23 24 views
9

Viene sollevata un'eccezione se si tenta di mostrare una finestra di messaggio se lo Dispatcher è sospeso (chiamato Dispatcher.DisableProcessing()).Come posso rilevare se Dispatcher.DisableProcessing è attivo?

InvalidOperationException: "L'elaborazione del dispatcher è stata sospesa" (vedere here).

qualcuno sa come posso rilevare dove il Dispatcher è sospeso o no (quindi so quando chiamare BeginInvoke())?

Edit 1:

In reazione alla manifestazione Application.DispatcherUnhandledException che sto cercando di mostrare un MessageBox. Tuttavia, se questa eccezione non gestita è stata generata durante DataBinding (ad esempio ItemsControl.ItemsSource), lo Dispatcher viene sospeso. Cercando di mostrare un MessageBox allora fallisce. Usare sempre Dispatcher.BeginInvoke() risolve il problema, ma non voglio farlo se non è veramente necessario.

Edit 2:

utilizzando la riflessione per raggiungere questo funziona in questo modo:

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

ti suggerisco di fornire maggiori dettagli qui, rendendo così la questione completa sul posto. –

risposta

0

Non esiste un'interfaccia pubblica lì così non si dispone di un modo legale per dire se è sospeso o no. Puoi ancora usare la riflessione, ma in generale questo indica che stai facendo qualcosa di completamente sbagliato.

Se potessi fornirci maggiori dettagli potremmo suggerire una soluzione adeguata?

+1

In risposta all'evento Application.DispatcherUnhandledException, sto provando a visualizzare un MessageBox. Tuttavia, se questa eccezione non gestita è stata generata durante DataBinding (cioè ItemControl.ItemsSource), il Dispatcher viene sospeso. Cercando di mostrare un MessageBox, fallisce. Usare sempre Dispatcher.BeginInvoke() risolve il problema, ma non voglio farlo se non è veramente necessario. – Muri

-1

provare questo:

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

} 
+0

Questo non funziona. Il threadState è ancora "in esecuzione" durante un periodo di tempo DisableProcessing. –

Problemi correlati