Sobre la clase temporizadora en C# Hay tres clases temporizadoras en C#
1. Definir en System.Windows.Forms
2. Definido en la clase System.Threading.Timer
3. Definido en la clase System.Timers.Timer
System.Windows.Forms.Timer se aplica a WinForm, se implementa mediante el mecanismo de mensajes de Windows, similar al control Timer en VB o Delphi, y se implementa internamente usando la API SetTimer. Su principal inconveniente es que la sincronización no es precisa y debe haber un bucle de mensajes, que no está disponible para la aplicación de consola.
System.Timers.Timer es muy similar a System.Threading.Timer, se implementa mediante .NET Thread Pool, tiene un timing ligero y preciso, y no requiere requisitos especiales para aplicaciones y mensajes. System.Timers.Timer también puede aplicarse a WinForm, reemplazando completamente el control Timer anterior. Su desventaja es que no soportan arrastrar y soltar directamente y requieren codificación manual.
Ejemplo:
Usa la clase System.Timers.Timer
Temporizadores.Sistema.Temporizador t = nuevo Temporizador.Sistema(10000); Instancia la clase Timer y establece el intervalo a 10.000 milisegundos.
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); Ejecutar eventos cuando llegue el momento;
t.AutoReset = verdadero; Establece si ejecuta una vez (falso) o todo el tiempo (verdadero);
t.Habilitado = verdadero; si ejecutar el evento System.Timers.Timer.Elapsed;
public void theout (fuente de objetos, System.Timers.ElapsedEventArgs e)
{
MensajeBox.Show("¡OK!");
}
Análisis experimental de las similitudes y diferencias entre el uso de tres temporizadores en C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Hay tres tipos de temporizadores disponibles en C#:
1. Temporizador estándar basado en Windows (System.Windows.Forms.Timer)
2. Temporizador basado en servidor (System.Timers.Timer)
3. Temporizador de Hilos (System.Threading.Timer)
Vamos a hacer algunos pequeños experimentos para analizar las similitudes y diferencias entre los tres temporizadores, especialmente la parte relacionada con los hilos.
Captura de pantalla de un ejemplo experimental:
1. Temporizador estándar basado en Windows (System.Windows.Forms.Timer)
Lo primero que hay que señalar es que Windows Timer está diseñado para entornos de hilo único
Este temporizador está presente en el producto desde la versión 1.0 de Visual Basic y se ha mantenido prácticamente sin cambios
Este temporizador es el más fácil de usar, solo tienes que arrastrar el control del temporizador desde la caja de herramientas al formulario y establecer las propiedades como eventos e intervalos
Los resultados experimentales también son totalmente coherentes con las características del hilo único:
1. Cuando se inicia este temporizador, el ID del hilo hijo se mostrará en la lista de ID del hilo hijo que aparece a continuación, y es el mismo que el ID del hilo principal
vacío privado formsTimer_Tick(object sender, EventArgs e)
{
i++;
lblSubThread.Text += "Ejecución de subhilo, ID de hilo:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Cuando el hilo principal está pausado durante 5 segundos, el hilo hijo pausará la ejecución, y cuando el hilo hijo suspendido previamente no se ejecutará después de 5 segundos, el hilo hijo siguiente se ejecutará directamente (es decir, generará unas líneas de valores).
System.Threading.Thread.Sleep(5000);
3. Pausar los eventos de un proceso hijo durante 5 segundos hará que la ventana principal deje de responder durante 5 segundos
4. Defina una variable estática de hilo:
[Estática de hilo]
estática privada int i = 0;
Añade uno a cada evento de subhilo y luego haz clic en el valor de la variable estática del hilo para obtener el valor i aumentado
2. Temporizador basado en servidor (System.Timers.Timer)
System.Timers.Timer no depende de formularios, despierta hilos del pool de hilos y es una versión actualizada del temporizador tradicional optimizada para ejecutarse en un entorno servidor
No hay controles listos de fábrica en la caja de herramientas VS2005 y deben ser codificados manualmente para usar este temporizador
Hay dos formas de usarla,
1. Adjuntar al formulario mediante la propiedad SynchronizingObject
Temporizadores.Temporizadores temporizadores = nuevo Temporizador. Temporizador ();
timersTimer.Enabled = false;
temporizadoresTimer.Intervalo = 100;
temporizadoresTimer.Elapsed += nuevo Sistema.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = esto;
De este modo, el experimento funciona casi igual que un temporizador estándar basado en Windows, salvo que en el segundo experimento anterior, aunque la ejecución del subhilo también se pausará, tras 5 segundos se ejecutarán todas las tareas previamente en cola (es decir, no faltarán algunas líneas de valor).
2. No utilice la propiedad SynchronizingObject
Este método es multihilo, es decir, el hilo hijo inicial y la forma principal no están en el mismo hilo. Sin embargo, también existe un problema: dado que el subhilo es un hilo separado, no se puede acceder a los controles del formulario, sino que solo pueden acceder a través de un proxy:
delegar void SetTextCallback(texto en cadena);
Fuente: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Comparación de tres objetos temporizadores en el blog C#_dash_Sina
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "ejecución hijo, ID de hilo:" + System.Threading.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nuevo SetTextCallback(SetText);
éste. Invoke(d, nuevo objeto[] { texto });
i++;
}
privado void SetText(texto en cadena)
{
lblSubThread.Text += texto;
}
De este modo, obtendremos nuevamente los siguientes resultados del experimento:
1. Cuando se inicia este temporizador, el ID del hilo hijo se mostrará en la lista de ID del hilo hijo que aparece a continuación, y es diferente del ID del hilo principal
2. Cuando haces clic en el hilo principal para pausar durante 5 segundos, el subhilo seguirá ejecutándose (puede que no sea visible en la interfaz, pero se puede ver fácilmente al enviar el archivo en el subhilo)
3. Pausar los eventos de un proceso hijo durante 5 segundos no hará que la ventana principal deje de responder
4. Añadir uno a la variable estática del hilo cada vez en el evento del subhilo, y luego hacer clic en si la variable estática del hilo vale 0 o 0 (no cambiará la variable estática del hilo en la ventana principal).
3. Temporizador de Hilos (System.Threading.Timer)
Los temporizadores de hilos tampoco dependen de formularios, son temporizadores simples y ligeros que usan métodos de callback en lugar de eventos, y funcionan con hilos de pool de hilos.
Los temporizadores de hilos son útiles en situaciones donde los mensajes no se envían en hilos.
Así es como se usa:
System.Threading.Timer ThreadTimer;
Public void ThreadMethod(Estado del objeto)
{
//使用代理
string text = "ejecución hijo, ID de hilo:" + System.Threading.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nuevo SetTextCallback(SetText);
éste. Invoke(d, nuevo objeto[] { texto });
i++;
}
vacío privado Form1_Load(object sender, EventArgs e)
{
threadTimer = nuevo System.Threading.Timer(nuevo System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Código de pausa:
threadTimer.Change(-1, -1);
El efecto del experimento es el mismo que el de la segunda forma del temporizador basado en servidor (System.Timers.Timer),
Por supuesto, los métodos y principios de uso específicos son diferentes, lo más importante es que este método utiliza el método agente en lugar del método de eventos, y puede ejecutarse por separado sin depender de formularios y componentes
A continuación se presenta una tabla resumida por extranjeros (la diferencia entre los tres métodos):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Soporte para añadir y eliminar oyentes después de que el temporizador se instaure. Sí No Sí
Soporta devolución de llamada en el hilo de la interfaz de usuario Sí No Sí
Llamadas de vuelta desde hilos obtenidos del pool de hilos Sí Sí No
Soporta arrastrar y soltar en Windows Forms Designer. Sí y no.
Adecuado para ejecutarse en un entorno multihilo de servidor. Sí sí no
Incluye soporte para pasar un estado arbitrario desde la inicialización del temporizador hasta la callback. No, no, no.
Implementa IDisposable Sí Sí Sí Sí
Soporta callbacks puntuales así como callbacks periódicas repetitivas Sí Sí Sí
Accesible a través de los límites del dominio de la aplicación. Sí, sí, sí
Soporta IComponent – alojable en un IContainer Sí No Sí |