Comparación de Timer con DispatcherTimer

98

¿Qué es una diferencia between System.Windows.Forms.Timer()y System.Windows.Threading.DispatcherTimer()? ¿En qué casos deberíamos utilizarlos? alguna de las mejores prácticas?

paradisonoir
fuente

Respuestas:

111

Windows.Forms.Timerutiliza el bucle de mensajes de Windows Forms para procesar los eventos del temporizador. Se debe usar al escribir eventos de temporización que se usan en aplicaciones de Windows Forms y desea que el temporizador se active en el subproceso principal de la interfaz de usuario.

DispatcherTimeres el mecanismo de temporización de WPF. Debe usarse cuando desee manejar el tiempo de manera similar (aunque esto no se limita a un solo subproceso; cada subproceso tiene su propio despachador) y está usando WPF. Activa el evento en el mismo hilo que el Dispatcher.

En general, WPF == DispatcherTimery Windows Forms == Forms.Timer.

Dicho esto, también System.Threading.Timerexiste un temporizador classque se activa en un hilo separado. Esto es bueno para tiempos puramente numéricos, donde no está intentando actualizar la interfaz de usuario, etc.

Reed Copsey
fuente
1
Gracias por su pronta respuesta. Entonces, esto significa que siempre que quiera tener un temporizador relacionado con la interfaz de usuario, debería usar DispatcherTimer, y cuando quiera disparar un temporizador, que no quiero congelar UL, debería usar System.Threading.Timer en un hilo. La segunda pregunta es: si quiero usar DispatcherTimer, y quiero tener un temporizador que no esté vinculado a la interfaz de usuario, ¿debería llamarlo en un hilo separado usando System.Threading.Timer o aún DisptacherTimer?
Paradisonoir
3
Depende de lo que intente hacer. Rara vez uso System.Threading.Timer: por lo general, me quedo con Dispatcher Timer y luego hago su TRABAJO (que es lo que podría bloquear su IU) en otro hilo, usando algo como un BackgroundWorker. Los temporizadores nunca deberían bloquear su interfaz de usuario, a menos que esté haciendo "demasiado" trabajo en su controlador de eventos.
Reed Copsey
Tengo un problema con DispatcherTimer consumiendo el procesador con el tiempo. ¿Existe una buena forma de manejar eso?
Discorax
Verifique qué está consumiendo específicamente la CPU. ¿Estás creando muchos temporizadores que no se detienen?
Reed Copsey
3
Asegúrese de establecer la propiedad del intervalo correctamente. No hagas esto: timer1.Interval = new TimeSpan (1000); // ¡"1000" representa tics, no milisegundos! La CPU estaba muy alta, hasta que la corrigí con esto: timer1.Interval = System.TimeSpan.FromSeconds (1);
Lonnie Best
4

Encontré un buen artículo sobre temporizadores con pequeños ejemplos aquí: http://www.progware.org/Blog/post/Timers-in-WPF.aspx

Como conclusión:

Si DoSomething () manipula los componentes de la GUI, entonces con el temporizador debe usar: this.Dispatcher.Invoke ((Action) delegate {// GUI RELATED CODE HERE} ya que no puede acceder a los controles de la GUI desde un hilo diferente directamente. Con DispatcherTimer lo hace no es necesario hacer eso.

Si DoSomething () realiza una tarea que requiere mucho tiempo, la GUI se congelará en el caso de DispatcherTimer. En el caso del temporizador no lo hará ya que los métodos largos se ejecutan en un hilo diferente

Buscador
fuente