Red de conocimiento informático - Aprendizaje de código fuente - Consejo: utilice la clase Temporizador [3] de la biblioteca de clases .Net Framework.

Consejo: utilice la clase Temporizador [3] de la biblioteca de clases .Net Framework.

A diferencia de las dos clases de temporizador que presenté al principio, System Threading Timer tiene cuatro constructores sobrecargados, como se muestra a continuación public Timer(TimerCallback callback object state long dueTime long period).public Timer(TimerCallback callback object state UInt dueTime UInt period); public Timer (estado del objeto de devolución de llamada TimerCallback int dueTime int period); public Timer (estado del objeto de devolución de llamada TimerCallback TimeSpan dueTime TimeSpan period); el método señalado por TimerCallback es el siguiente

public void TimerCallback(estado del objeto);

El segundo parámetro (estado) puede estar vacío o contener especificaciones de información del programa. Cada vez que se llama a un evento de temporizador, el objeto de estado se pasa como parámetro a la función TimerCallback. Recuerde que la función TimerCallback se ejecuta en un hilo de trabajo. Puede especificar una hora para iniciar el temporizador inmediatamente o evitar que el temporizador se inicie automáticamente. Puede utilizar la constante infinita de tiempo de espera del subproceso del sistema para evitar que el temporizador se inicie automáticamente.

El cuarto parámetro (período) lo permite. usted debe definir el intervalo de tiempo en milisegundos entre llamadas a la función de devolución de llamada. Definir un tiempo de espera indefinido o un tiempo de espera indefinido para este parámetro evita llamadas posteriores al evento del temporizador.

Una vez que se llama al constructor, aún puedes cambiar la hora y el período de la función de devolución de llamada usando el método Change.

Cambiar dueTime y period Este método tiene las siguientes cuatro formas sobrecargadas public bool Change(int dueTime int period Change(uint dueTime uint period) Change(long dueTime public bool Change(TimeSpan dueTime TimeSpan period); );

Aquí está el código que uso para iniciar y detener el temporizador en el programa de muestra //Inicializa el temporizador para que no se inicie automáticamente System Threading Timer tmrThreadingTimer = newSystem Threading Timer(new TimerCallback(tmrThreadingTimer_TimerCallback)) null System Threading Timeout Infinite); //Inicia manualmente el temporizador tmrThreadingTimer Change( ); //Detiene manualmente el temporizador tmrThreadingTimer Change (Timeout Infinte Timeout Infinite

Como esperaba, seleccione la clase System Threading Timer Running); el programa de muestra produce el mismo resultado que la clase System Timers Timer porque la función TimerCallback también se llama en el subproceso de trabajo. La figura muestra el resultado del programa de muestra.

A diferencia de la clase System Timers Timer, no se proporcionan propiedades correspondientes a SynchronizingObject. Cualquier solicitud para acceder a un control de UI debe realizarse a través de la clase Invoke o BeginInfo del control. Cualquier solicitud para acceder a un control de UI debe realizarse a través del método Invoke o BeginInvoke del control

Programación de temporizadores segura para subprocesos

Para maximizar la reutilización de código, los tres tipos diferentes de eventos del temporizador todos llaman al mismo método ShowTimerEventFired.

void tmrWindowsFormsTimer_Tick(objeto remitente System EventArgse){ ShowTimerEventFired(DateTime Now GetThreadName());} private void tmrTimersTimer_Elapsed(objeto remitente System TimersElapsedEventArgse){?ShowTimerEventFired(DateTime Now GetThreadName());} private void tmrThreadingTimer_TimerCallback(objeto estado){ Despedido( DateTime Now GetThreadName()); para distinguir el subproceso de trabajo y el subproceso de la interfaz de usuario, establezca la propiedad de nombre del objeto CurrentThread en la función auxiliar UIThread GetThreadName en el punto de entrada principal del programa de muestra para devolver el valor de Thread CurrentThread Name. o establezca la propiedad Thread CurrentThread IsThreadPoolThread en Cuando es verdadero, devuelve el valor del subproceso de la interfaz de usuario. WorkerThread

Debido a que los eventos de temporizador para System Timers Timer y System Threading Timer se ejecutan en un subproceso de trabajo, cualquier código de interacción del usuario en el controlador de eventos no se ejecuta inmediatamente. Por lo tanto, cualquier código de interacción del usuario dentro de la función del controlador de eventos no se ejecuta inmediatamente, sino que se enumera y espera regresar al subproceso de la interfaz de usuario para su procesamiento. Para hacer esto, creé un delegado ShowTimerEventFiredDelegate que llama al delegado privado void ShowTimerEventFiredDelegate (DateTime eventTime string threadName);