2009-10-23 25 views
9

Se genera una excepción si se intenta mostrar un cuadro de mensaje si se suspende el Dispatcher (se llama al Dispatcher.DisableProcessing()).¿Cómo puedo detectar si Dispatcher.DisableProcessing está activo?

InvalidOperationException: 'El proceso de Dispatcher se ha suspendido' (ver here).

¿Alguien sabe cómo puedo detectar cuando el Dispatcher se suspende o no (por lo que saben cuándo llamar BeginInvoke())?

Edición 1:

Como reacción al evento Application.DispatcherUnhandledException Estoy tratando de mostrar un cuadro de mensaje. Sin embargo, si esta Excepción no controlada se lanzó durante DataBinding (es decir, ItemsControl.ItemsSource), se suspende el Dispatcher. Si intenta mostrar un MessageBox, falla. Usar siempre Dispatcher.BeginInvoke() resuelve el problema, pero no quiero hacerlo a menos que sea realmente necesario.

Edición 2:

utilizando la reflexión de lograr esto funciona así:

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

Sugiero que usted proporciona más detalles aquí, con lo que la pregunta completa en el lugar. –

Respuesta

0

No hay ninguna interfaz pública allí, así que no tiene una forma legal para decir si se suspende o no. Aún puede usar la reflexión, pero en general, esto indica que está haciendo algo totalmente incorrecto.

Si pudiera darnos más detalles, podría sugerir una solución adecuada?

+1

En reacción al evento Application.DispatcherUnhandledException, intento mostrar un MessageBox. Sin embargo, si se lanzó esta excepción no controlada durante el enlace de datos (es decir, ItemsControl.ItemsSource), se suspende el despachador. Al intentar mostrar un MessageBox, falla. Siempre utilizando Dispatcher.BeginInvoke() resuelve el problema, pero no quiero hacer eso a menos que sea realmente necesario. – Muri

-1

probar esto:

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

} 
+0

Esto no funciona. El threadState aún se está "Ejecutando" durante un período de tiempo DisableProcessing. –

Cuestiones relacionadas