¿El System.Windows.Forms.Timer se ejecuta en un subproceso diferente de la UI?

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.

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

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

No tendrás 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 temporizador estándar de Windows .

La documentación confirma esto en la sección Observaciones:

Un temporizador se usa para generar un evento a 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 utiliza este temporizador, use el evento Tick para realizar una operación de sondeo o para mostrar una pantalla de bienvenida durante un período de tiempo específico. 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.

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

No.

El objective de Windows.Forms Timer es que se ejecute en el subproceso GUI.

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

Todo el código se ejecuta como parte de un manejador de eventos de alguna manera, y un ticker de temporizador nunca ‘interrumpirá’ a ningún otro manejador de eventos.

El temporizador Windows.Forms vuelve a generar el evento en el subproceso de interfaz de usuario, presumiblemente a través del contexto de sincronización.

Si desea un hilo que no sea UI, existen otros temporizadores, por ejemplo, System.Timers.Timer o System.Threading.Timer.

De acuerdo con la documentación que se ejecuta en el hilo principal de UI:

Un temporizador se usa para generar un evento a 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.