2010-12-16 22 views
7

Cuando usamos System.Threading.Timer, a continuación, es el método ejecutado en el subproceso que creó el temporizador? ¿O se ejecuta en otro hilo?System.Threading.Timer

class Timer 
{ 
    static void Main() 
    { 
     TimerCallback tcall = statusChecker.CheckStatus; 
     Timer stateTimer = new Timer(tcb, autoEvent, 1000, 250); 
    } 
} 
class StatusChecker 
{ 
    public void CheckStatus(Object stateInfo) 
    { 
    } 
} 

Mi pregunta es si el método llamado por el delegado del temporizador (CheckStatus) se ejecuta en el hilo principal o se ejecuta en otro hilo?

+0

¿Puedes publicar tu código? – Oded

+0

Es bastante ambiguo lo que está tratando de preguntar aquí. ¿Puede publicar algún código para aclarar su pregunta? –

Respuesta

6

System.Threading.Timer ejecutará su trabajo en otro hilo en el grupo de subprocesos.

System.Windows.Forms.Timer se ejecutará en el hilo existente (GUI).

+1

También debe tenerse en cuenta que el 'System.Windows.Forms.Timer' volverá a una secuencia de subprocesos si no hay formularios activos (como una aplicación de consola). Y el método se ejecutará cuando el hilo esté inactivo (no se ejecutarán los controladores de evento). Pero no pasas mucho tiempo en los controladores de eventos de todos modos, ¿verdad? :) –

+0

@Vilx - No lo sabía, así que gracias por el comentario adicional sobre mi respuesta :) –

+0

En realidad ... Lo llevo de vuelta. No revierte Solo se puede usar en Windows Forms. Pero estoy seguro de que una vez (no hace mucho tiempo) vi uno de los temporizadores estándar que elegían entre formularios de Windows o thread de subprocesos ... pero ahora no lo puedo encontrar. :( –

2

Los documentos dicen lo siguiente:

El método especificado para la devolución de llamada debe ser de reentrada, porque es llamado en las roscas ThreadPool.

Por lo tanto, la devolución de llamada casi seguramente estará en otro hilo.

Por supuesto, si inicia el temporizador de un hilo ThreadPool, hay una posibilidad de que podría ejecutar en el mismo hilo, pero no hay garantía.

2

MSDN Unidos:

Utilice un delegado TimerCallback para especificar el método que desea el Timer a ejecutar. El temporizador delegado se especifica cuando se construye el temporizador y no se puede cambiar. El método no se ejecuta en el hilo que creó el temporizador; se ejecuta en un subproceso ThreadPool suministrado por el sistema.

Por lo tanto, en su ejemplo, el temporizador delegado (CheckStatus) se ejecutará en un hilo separado.

Cuestiones relacionadas