w10 tareas tarea programar programador para instalar eliminar como .net wpf multithreading timer

.net - programador - programar tareas en w10



DispatcherTimer frente a un temporizador regular en la aplicaciĆ³n WPF para un programador de tareas (3)

Explique la diferencia entre "DispatcherTimer" y "un temporizador normal" que @Kent Boogaart pretendía utilizar en una aplicación WTF de subprocesos múltiples como supervisor de tareas en este tema:

Se necesita asesoramiento para la estrategia de multi-threading para la aplicación WPF

en los comentarios a uno de los post (cita):

-Si todo lo que DispatcherTimer hace es iniciar otro hilo, ¿cuál es el sentido de usar DispatcherTimer? .... esos hilos no necesitan ser iniciados en el hilo de UI. Podrías usar un temporizador regular y evitar interrumpir la interfaz de usuario por completo

¿Qué significa "un temporizador regular"? ¿Cómo difieren ("DispatcherTimer" y "Timer regular") con respecto a su impacto en la UI?

(Hasta que leí esta publicación, pensé en DispatcherTimer como una forma natural de usar temporizadores en WPF. ¿Cuál es el caso cuando esto no es cierto?)


Con .NET 4.5 también puede crear un delegado async para su temporizador si necesita usar la nueva funcionalidad de await .NET 4.5.

var timer = new DispatcherTimer(); timer.Interval = TimeSpan.FromSeconds(20); timer.Tick += new EventHandler(async (object s, EventArgs a) => { Message = "Updating..."; await UpdateSystemStatus(false); Message = "Last updated " + DateTime.Now; }); timer.Start();


DispatcherTimer es el temporizador regular. Dispara su evento Tick en el hilo de la interfaz de usuario, puede hacer lo que quiera con la interfaz de usuario. System.Timers.Timer es un temporizador asincrónico, su evento Elapsed se ejecuta en una cadena de subprocesos. Debe tener mucho cuidado con su controlador de eventos, no tiene permitido tocar ningún componente de la interfaz de usuario o variables de datos. Y deberá usar la instrucción de bloqueo siempre que acceda a miembros de la clase que también se utilizan en el hilo de la interfaz de usuario.

En la respuesta vinculada, la clase Timer era más apropiada porque OP intentaba ejecutar código de forma asíncrona a propósito.


El evento Tick de Timer regular se dispara en realidad en el subproceso donde se creó el temporizador, por lo que en el evento tick, para acceder a cualquier elemento con la interfaz de usuario, tendrá que pasar por dispatcher.begininvoke como se menciona a continuación.

RegularTimer_Tick(object sender, EventArgs e) { txtBox1.Text = "count" + i.ToString(); // error can not access // txtBox1.Text property outside dispatcher thread... // instead you have to write... Dispatcher.BeginInvoke( (Action)delegate(){ txtBox1.Text = "count " + i.ToString(); }); }

En el caso del temporizador de Dispatcher, puede acceder a los elementos de la interfaz de usuario sin hacer la invocación de inicio o invocar de la siguiente manera ...

DispatcherTimer_Tick(object sender, EventArgs e) { txtBox1.Text = "Count " + i.ToString(); // no error here.. }

DispatcherTimer simplemente brinda comodidad sobre el temporizador regular para acceder fácilmente a los objetos de la interfaz de usuario.