Este artículo es un artículo espejo de traducción automática, por favor haga clic aquí para saltar al artículo original.

Vista: 18870|Respuesta: 1

[Fuente] Implementación en C# de tres temporizadores

[Copiar enlace]
Publicado en 12/10/2017 13:12:51 | | |
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í




Anterior:C# Desagrupamiento del conjunto de expresiones Lamda para tomar el valor mínimo
Próximo:Linq: Nunca uses Count() > 0 para determinar que el conjunto no está vacío
Publicado en 8/11/2017 14:02:44 |
Es cierto. Está muy bien, pero ¿por qué no respondiste a la publicación?
Renuncia:
Todo el software, materiales de programación o artículos publicados por Code Farmer Network son únicamente para fines de aprendizaje e investigación; El contenido anterior no se utilizará con fines comerciales o ilegales; de lo contrario, los usuarios asumirán todas las consecuencias. La información de este sitio proviene de Internet, y las disputas de derechos de autor no tienen nada que ver con este sitio. Debes eliminar completamente el contenido anterior de tu ordenador en un plazo de 24 horas desde la descarga. Si te gusta el programa, por favor apoya el software genuino, compra el registro y obtén mejores servicios genuinos. Si hay alguna infracción, por favor contáctanos por correo electrónico.

Mail To:help@itsvse.com