2010-12-01 7 views

Respuesta

5

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)

+0

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

1

¿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.

Cuestiones relacionadas