¿Cómo puedo comprobar si el subproceso actual se encuentra en el contexto de la GUI o no?Comprobar si el subproceso está en el contexto Gui
Respuesta
Desafortunadamente es difícil responder a esta pregunta con 100% de precisión porque no siempre es completamente obvio lo que constituye un contexto de GUI. Es más una heurística que una respuesta sí/no. Y la heurística será diferente para cada marco de GUI.
para WPF un buen uno es para comprobar y ver si hay como un activo Dispatcher
para el subproceso actual
public static bool IsWpfGuiThread() {
return Dispatcher.FromThread(Thread.CurrentThread) != null;
}
Sin embargo, esto puede ser engañado por sólo la creación de un Dispatcher
en un hilo al azar, pero en realidad no poner una GUI en la parte superior.
Para WinForms uno bueno para comprobar es el SynchronizationContext
actual.
public static bool IsWinFormsGuiThread() {
return SynchronizationContext.Current is WindowsFormsSynchronizationContext;
}
Sin embargo, esto puede ser engañado por alguien temporalmente (o más) de restablecer el valor Current
a otro contexto de sincronización. Esto es esencialmente solo un hilo global y puede ser establecido por cualquier persona. En realidad es bastante común que cambie en ciertas aplicaciones como Visual Studio (pero es una aplicación WPF)
Creo que quieres el objeto Dispatcher
. Ver http://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55
¿Está preguntando si tiene un objeto gui conocido puede consultarlo para ver si se encuentra en el contexto adecuado de ese objeto? Creo que guiObject.VerifyAccess()
funcionará para esto.
- 1. Comprobar si el cronómetro está funcionando
- 2. Comprobar si el proceso se está ejecutando
- 3. Comprobar si el elemento está en una matriz/lista
- 4. Cómo comprobar si el valor está en la lista
- 5. ¿Cómo comprobar si el objeto JSON está vacío en Java?
- 6. Comprobar si un widget está en el diseño Qt
- 7. comprobar si el puerto está abierto en ANT
- 8. ¿Cómo comprobar si el objeto JSON está vacío en PHP?
- 9. ¿Cómo comprobar si el socket está cerrado en Boost.Asio?
- 10. Comprobar si el texto está en una cadena
- 11. JS jQuery - comprobar si el valor está en serie
- 12. Comprobar si el buzón está vacío en erlang
- 13. Comprobar si el directorio está vacío en Ruby
- 14. Cómo comprobar si el compilador JIT está desactivado en Java
- 15. ¿Está seguro el subproceso RNGCryptoServiceProvider.GetBytes?
- 16. una línea para comprobar si el contenedor STL está ordenado
- 17. ¿Cómo comprobar si el cursor está sobre un elemento?
- 18. jQuery Mobile cómo comprobar si el botón está deshabilitado?
- 19. Cómo comprobar si el elemento se está arrastrando actualmente
- 20. Comprobar si el botón de selección específico está marcado
- 21. Cómo comprobar si el seguimiento de cambios está habilitado
- 22. Android: ¿Cómo comprobar si el servidor está disponible?
- 23. jQuery: ¿Cómo comprobar si el ratón está sobre un elemento
- 24. Navaja MVC3: cómo comprobar si el modelo está vacío
- 25. objetivo comprobar si el campo de texto está vacío
- 26. jQuery validation: ¿Comprobar si el formulario está validado?
- 27. ¿Cómo comprobar si el menú desplegable está deshabilitado?
- 28. ¿Cómo comprobar si el usuario está conectado a internet wp7?
- 29. cómo comprobar si el hudson está ocupado o no?
- 30. cómo comprobar si el campo de archivo está vacío?
Sé que esta es una respuesta anterior, pero ... puede haber múltiples subprocesos de UI en una aplicación WPF, buscando un despachador activo en el hilo actual usando [Dispatcher.FromThread()] (https: // msdn. microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx) no es un buen indicador de que sea un (o "el") subproceso de interfaz de usuario. Una de las mejores maneras de manejar esto es hacer un seguimiento del SynchronizationContext del hilo que inicia un hilo de larga ejecución o de fondo, aquí es donde el async/await puede ser útil (no es que exista cuando se escribió esta respuesta por primera vez). – slugster