Pregunta

Por el bien del argumento, consideremos un hilo de interfaz de usuario como un hilo que ha tenido una llamada a Application.Run() o uno de él es sobrecargas llamados en él y tiene un bucle de mensajes de funcionamiento activo.

¿Hay una manera de detectar si estamos actualmente se ejecuta en un hilo tan?

La razón por la que quiero que esto es porque tengo una clase con una función privada que es de larga ejecución. La clase en sí ya es multiproceso, y el uso de esta clase es tal que podría ser utilizado ya sea de la interfaz de usuario o de hilos de fondo haciendo procesamiento. Esta función también entra en esta red. Pero no quiero que se bloquee el hilo de interfaz de usuario. Así que quiero para detectar si estoy ejecutando en un subproceso de interfaz de usuario y si es así, la llamada de función tenedor en un subproceso en segundo plano (probablemente ThreadPool, pero eso es un problema no para esta discusión). Esto es totalmente comporta bien, pero los temas de fondo son, probablemente, confiando en la salida de la función, por lo que el bloqueo para ellos es mejor, mientras que el hilo de interfaz de usuario está accediendo a ella de una manera más "set-and-forget".

¿Fue útil?

Solución

Yo sugeriría que es el tipo de decisión de la persona que llama debe hacer. Siempre se puede escribir métodos de contenedor para que sea más fácil - pero significa que usted no tendrá problemas con la persona que llama está en una situación "extraña" (por ejemplo, un marco de interfaz de usuario que no sabe acerca de, o algo más con un bucle de eventos ) y tomar la decisión equivocada para ellos.

Si el método siempre tiene que proporcionar información en el hilo correcto, me lo pase en un ISynchronizeInvoke (implementado por Control) para hacer eso de una manera independiente del interfaz de usuario.

Otros consejos

Si usted tiene acceso a una Form o una Control, se puede comprobar el InvokeRequired propiedad; Esto devolverá false si usted está en el hilo de interfaz de usuario y true si no está .. Si ocurre en un contexto en que no se puede comprobar en contra de un Control, que fácilmente podría establecer una propiedad estática en su programa que se puede comprobar en contra. Almacenar una referencia a Thread.CurrentThread en el arranque, y para comparar Thread.CurrentThread a que se hace referencia cuando se necesita saber:

static class Program
{
    private static Thread _startupThread = null;

    [STAThread]
    static void Main()
    {
        _startupThread = Thread.CurrentThread;

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

    public static bool IsRunningOnStartupThread()
    {
        return Thread.CurrentThread == _startupThread;
    }
}

Al llamar Program.IsRunningOnStartupThread obtendrá un bool decir si está o no.

bool isMessageLoopThread = System.Windows.Forms.Application.MessageLoop;

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