c# winforms asynchronous timer

c# - Creando un temporizador de fondo para ejecutar de forma asíncrona



winforms asynchronous (3)

Creo que necesitas saber sobre todas las clases de temporizador. Vea la respuesta de Jon a continuación.

¿Qué tipo de temporizador estás usando?

  1. System.Windows.Forms.Timer se ejecutará en el subproceso de la interfaz de usuario
  2. System.Timers.Timer se ejecuta en un subproceso de grupo de subprocesos a menos que especifique un objeto SynchronizingObject
  3. System.Threading.Timer ejecuta su devolución de llamada en un subproceso de grupo de subprocesos

En todos los casos, el temporizador será asíncrono, no "tomará" un hilo hasta que se dispare.

Fuente: ¿Los temporizadores .NET se ejecutan de forma asíncrona?

Estoy realmente luchando con esto. Estoy creando una aplicación de winforms en Visual Studio y necesito un temporizador de fondo que marque una vez cada media hora. El propósito de esto es bajar las actualizaciones de un servidor.

He intentado un par de enfoques diferentes, pero han fallado, ya sea debido a tutoriales / ejemplos deficientes, o a mis propias deficiencias en C# . Creo que sería una pérdida de tiempo mostrarte lo que he intentado hasta donde parece que lo que intenté estaba bastante lejos de la realidad.

¿Alguien sabe de una manera clara y sencilla de implementar un temporizador de fondo asíncrono que sea fácilmente comprensible para un novato en C# ?


Declara la variable miembro en tu formulario:

System.Timers.Timer theTimer;

En la carga del formulario (o en cualquier otro momento en que necesite iniciar el sondeo de actualización), haga:

theTimer = new System.Timers.Timer(1800000); theTimer.Elapsed += PollUpdates; theTimer.Start();

Declare la función de miembro de PollUpdates de esta manera:

private void PollUpdates(object sender, EventArgs e) { }


// Create a 30 min timer timer = new System.Timers.Timer(1800000); // Hook up the Elapsed event for the timer. timer.Elapsed += OnTimedEvent; timer.Enabled = true; ... private static void OnTimedEvent(object source, ElapsedEventArgs e) { // do stuff }

con las advertencias habituales de: el temporizador no será muy preciso y podría necesitar GC.KeepAlive(timer)

Ver también: ¿Por qué un System.Timers.Timer sobrevive a GC pero no a System.Threading.Timer?