2009-10-23 10 views
9

Une exception est levée si l'on tente d'afficher une boîte de message si le Dispatcher est suspendu (Dispatcher.DisableProcessing() appelé).Comment puis-je détecter si Dispatcher.DisableProcessing est actif?

InvalidOperationException: 'traitement répartiteur a été suspendu' (voir here).

Est-ce que quelqu'un sait comment je peux détecter où le Dispatcher est suspendu ou non (donc je sais quand appeler BeginInvoke())?

Edit 1:

En réaction à l'événement Application.DispatcherUnhandledException je suis en train de montrer un MessageBox. Toutefois, si cette exception non gérée a été levée pendant DataBinding (c'est-à-dire ItemsControl.ItemsSource), le Dispatcher est suspendu. Essayer de montrer un MessageBox échoue ensuite. Toujours en utilisant Dispatcher.BeginInvoke() résout le problème, mais je ne veux pas faire cela, sauf si vraiment nécessaire.

Edit 2:

aide de la réflexion pour accomplir cela fonctionne comme ceci:

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

Je vous suggère de fournir plus de détails ici, rendant ainsi la question complète en place. –

Répondre

0

Il n'y a pas d'interface publique là pour que vous ne disposez pas d'un moyen légal pour dire que ce soit suspendu ou non. Vous pouvez toujours utiliser la réflexion, mais en général cela indique que vous faites quelque chose de totalement faux.

Si vous pouviez nous donner plus de détails nous pourrions vous suggérer une solution appropriée?

+1

En réaction à l'événement Application.DispatcherUnhandledException, j'essaie d'afficher un MessageBox. Toutefois, si cette exception non gérée a été levée pendant la liaison de données (c'est-à-dire ItemsControl.ItemsSource), le Dispatcher est suspendu. Essayer d'afficher un MessageBox échoue ensuite. Toujours en utilisant Dispatcher.BeginInvoke() résout le problème, mais je ne veux pas le faire à moins que ce ne soit vraiment nécessaire. – Muri

-1

essayez ceci:

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

} 
+0

Cela ne fonctionne pas. Le threadState est toujours "en cours d'exécution" pendant une période DisableProcessing. –

Questions connexes