¿Cómo puedo averiguar si el método se ejecuta en hilo de interfaz de usuario o no de una manera disociada?

StackOverflow https://stackoverflow.com/questions/907166

  •  05-09-2019
  •  | 
  •  

Pregunta

Este es el problema que tengo: Necesito para asegurarse de que un objeto se crea una instancia en el hilo de interfaz de usuario. Si no es así, se debe lanzar una excepción. Pero ¿cómo puedo comprobar dentro de un método si se está ejecutando en el subproceso de interfaz de usuario? Nota:. No quiero pasar toda la información en el constructor del objeto

El candidato ideal sería la (aplicación WPF de SynchronizationContext) DispatcherSynchronizationContext la que internamente contiene una referencia al despachador que hace referencia el hilo que está asociado con, pero por desgracia ese campo es privado lo que no hay manera para mí para acceder a él.

¿Fue útil?

Solución

pequeña aclaración, aunque normalmente sólo hay 1 UI hilo no puede haber muchos hilos de interfaz de usuario. Esto es cierto tanto para WPF y Windows Forms.

La mejor manera que he encontrado para lograr esto sin embargo es con un SynchronizationContext. Tanto WinForms WPF y establecerán un SynchronizationContext sobre cualquier tema que se están ejecutando en la interfaz de usuario. Esta es la función que utilizo si no estoy atado a cualquier modelo de interfaz de usuario en particular.

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

Tenga en cuenta, no es de ningún modo a prueba de tontos. Es posible que los componentes que no son de interfaz de usuario para establecer un SynchronizationContext y esto volverían cierto para un simple subproceso de trabajo. De ahí el nombre no autorizada.

ligeramente de manera más confiable de hacer esto es como sigue. Pero se requiere hacer referencia a al menos una porción de WPF para poner en práctica.

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

Otros consejos

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top