2011-04-17 42 views
18

Tengo un hilo principal que crea un objeto de formulario que crea y establece un temporizador para ejecutar una función llamada updateStatus() cada minuto. Pero updateStatus() también es llamado por el hilo principal en varios lugares.¿System.Windows.Forms.Timer se ejecuta en un subproceso diferente al de la interfaz de usuario?

Sin embargo, no tengo claro si es o no causará ningún problema de sincronización. ¿El System.Windows.Forms.Timer en C# se ejecuta en un hilo diferente al hilo principal?

Respuesta

20

No, los eventos de temporizador se generan en el subproceso de la interfaz de usuario.

No tendrá problemas de sincronicidad. Esta es la versión correcta del control del temporizador para usar en una aplicación WinForms; está específicamente diseñado para hacer lo que estás pidiendo. Se implementa bajo el capó usando un estándar Windows timer.

El documentation confirma esto en la sección Comentarios:

un temporizador se utiliza para elevar un evento en intervalos definidos por el usuario. Este temporizador de Windows está diseñado para un entorno de subproceso único donde los subprocesos de interfaz de usuario se utilizan para realizar el procesamiento. Requiere que el código de usuario tenga una bomba de mensaje UI disponible y siempre opere desde el mismo hilo, o marque la llamada en otro hilo.

Cuando se utiliza este temporizador, utilice el evento Tick para realizar una operación de sondeo o para mostrar una pantalla de bienvenida por un período de tiempo especificado. Siempre que la propiedad Enabled se establezca en true y la propiedad Interval sea mayor que cero, el evento Tick se genera a intervalos en función de la configuración de la propiedad Interval.

+0

Así que el temporizador de Windows se ejecuta en el hilo principal, siempre será sincrónico y no necesito poner bloque de bloqueo dentro de la función updateStatus(). ¿Estoy en lo cierto? – user186246

+0

@user: Sí, eso es correcto. Se ejecuta como cualquier otro evento que se genera en su formulario, como los eventos 'Paint' o' Load'. Tampoco necesita bloquear esos manejadores. –

6

El punto entero de un temporizador Windows.Forms es que se ejecuta en el subproceso de interfaz gráfica de usuario.

de Windows (Windows Forms) se ejecuta algo llamado el MessagePump (ver Application.Run()) y esto es lo que hace posible el temporizador.

Todo el código se ejecuta como parte de un manejador de sucesos de alguna manera, y una garrapata temporizador nunca 'interrupción' cualquier otro controlador de eventos.

+0

Hola, no estoy al tanto de messagePump. ¿Puedes darnos alguna información al respecto? – user186246

+0

Algo de información: http://blogs.msdn.com/b/oldnewthing/archive/2014/12/04/10577881.aspx –

2

Según la documentation que se ejecuta en el hilo principal de la interfaz de usuario:

Un temporizador se utiliza para elevar un evento en intervalos definidos por el usuario. Este temporizador Windows está diseñado para un entorno de un solo subproceso donde se utilizan UI hilos para realizar procesamiento. Se requiere que el código de usuario tiene una bomba de mensaje de interfaz de usuario disponible y siempre funciona de la misma hilo, o jefe de la llamada en otro hilo.

4

El temporizador Windows.Forms resucita el evento en el hilo de la interfaz de usuario, presumiblemente a través del contexto de sincronización.

Si desea un subproceso no interfaz de usuario, hay otros temporizadores - por ejemplo System.Timers.Timer o System.Threading.Timer

+1

No del todo. Utiliza mensajes de Windows, por lo que nunca deja el hilo de la interfaz de usuario. – SLaks

8

No, evento Tick del temporizador se eleva desde el subproceso de interfaz de usuario con el mensaje cuando recibe un mensaje WM_TIMER.Siempre eres bueno con eso, solo puede ejecutarse cuando tu subproceso de interfaz de usuario está inactivo.

Cuestiones relacionadas