2009-05-25 6 views
5

Aquí está el problema que tengo: necesito asegurarme de que un objeto se crea una instancia en el hilo de la interfaz de usuario. Si no es así, debería lanzar una excepción. ¿Pero cómo verifico dentro de un método si se está ejecutando en el hilo de UI? Nota: no quiero pasar ninguna información al constructor del objeto.¿Cómo puedo averiguar si el método se ejecuta en el hilo de UI o no de forma desacoplada?

El candidato perfecto sería el DispatcherSynchronizationContext (implementación de WPF de SynchronizationContext) que contiene una referencia interna a Dispatcher que hace referencia al hilo al que está asociado, pero desafortunadamente ese campo es privado, así que no hay forma de que yo pueda acceder.

Respuesta

8

Pequeña aclaración, aunque normalmente solo hay 1 subproceso de interfaz de usuario puede haber muchos subprocesos de interfaz de usuario. Esto es cierto tanto para WPF como para WinForms.

La mejor manera que he encontrado para lograr esto es con un SynchronizationContext. Tanto WPF como WinForms establecerán un SynchronizationContext en cualquier subproceso en el que ejecuten la IU. Esta es la función que uso si no estoy vinculado a ningún modelo de IU particular.

public bool IsPossiblyUIThread() { 
    return SynchronizationContext.Current != null; 
} 

Nota, de ninguna manera es infalible. Es posible que los componentes que no son de la interfaz de usuario establezcan un SynchronizationContext y esto devolvería true para un hilo de trabajo simple. De ahí el nombre no autorizado.

A ligeramente manera más confiable de hacerlo es la siguiente. Pero requiere que haga referencia al menos a una parte de WPF para implementar.

public bool IsLikelyWpfUIThread() { 
    var context = SynchronizationContext.Current; 
    return context != null && context is DispatcherSynchronizationContext; 
} 
+0

Sí, esta parece ser la mejor manera. ¡Muchas gracias! –

2

Dispatcher.CheckAccess() devuelve verdadero si el código se ejecuta en el mismo hilo como el despachador. Debería funcionar si solo hay un Dispatcher/UIThread.

+1

Esto podría ser cierto, pero tenga en cuenta que el despachador siempre está asociado con el hilo en el que se creó. Así que usar Dispatcher.CheckAccess() no te ayuda mucho si el objeto fue creado en otro hilo. –

Cuestiones relacionadas