À propos de la classe minuteur en C# Il y a trois classes minuteur en C#
1. Définir dans System.Windows.Forms
2. Défini dans la classe System.Threading.Timer
3. Défini dans la classe System.Timers.Timer
System.Windows.Forms.Timer est appliqué à WinForm, il est implémenté via le mécanisme de messages Windows, similaire au contrôle Timer dans VB ou Delphi, et est implémenté en interne via l’API SetTimer. Son principal inconvénient est que le timing n’est pas précis et qu’il doit y avoir une boucle de messages, qui n’est pas disponible pour l’application console.
System.Timers.Timer est très similaire à System.Threading.Timer, ils sont implémentés via .NET Thread Pool, légers, avec un timing précis, et aucune exigence particulière pour les applications et les messages. System.Timers.Timer peut également être appliqué à WinForm, remplaçant complètement le contrôle Timer mentionné ci-dessus. Leur inconvénient est qu’ils ne supportent pas le glisser-déposer direct et nécessitent un codage manuel.
Exemple :
Utilisez la classe System.Timers.Timer
Minuteries.Système.Minuterie t = nouvelle Minuteur.Système(10000) ; Instanciez la classe Timer et réglez l’intervalle à 10 000 millisecondes.
t.Elapsed += new System.Timers.ElapsedEventHandler(theout) ; Exécuter les événements lorsque le temps est atteint ;
t.AutoReset = vrai ; Fixer s’il faut exécuter une fois (faux) ou tout le temps (vrai) ;
t.Enabled = vrai ; s’il fallait exécuter l’événement System.Timers.Timer.Elapsed ;
public void theout (source de l’objet, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show (« OK ! ») ;
}
Analyse expérimentale des similitudes et différences entre l’utilisation de trois minuteurs en C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Il existe trois types de minuterie disponibles en C# :
1. Minuteur standard sous Windows (System.Windows.Forms.Timer)
2. Minuteur serveur (System.Timers.Timer)
3. Minuteur de threading (System.Threading.Timer)
Passons à travers quelques petites expériences pour analyser les similitudes et différences entre les trois minuteries, en particulier la partie liée au fil.
Capture d’écran de l’exemple expérimental :
1. Minuteur standard basé sur Windows (System.Windows.Forms.Timer)
La première chose à noter est que Windows Timer est conçu pour des environnements à thread unique
Ce minuteur est présent dans le produit depuis la version 1.0 de Visual Basic et est resté en grande partie inchangé
Ce minuteur est le plus facile à utiliser, il suffit de glisser le contrôle du minuteur de la boîte à outils vers le formulaire, et de définir les propriétés telles que les événements et les intervalles
Les résultats expérimentaux sont également parfaitement cohérents avec les caractéristiques du filetage simple :
1. Lorsque ce minuteur est lancé, l’ID du fil enfant sera affiché dans la liste des identifiants du fil enfant ci-dessous, et il est identique à l’identifiant principal du fil
vide privé formsTimer_Tick(objet émetteur d’objet, EventArgs e)
{
i++ ;
lblSubThread.Text += « Exécution du sous-thread, ID de thread : » + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + « \r\n » ;
}
2. Lorsque le thread principal est mis en pause pendant 5 secondes, le fil enfant met l’exécution en pause, et si le fil enfant suspendu précédemment ne sera pas exécuté après 5 secondes, le fil enfant suivant sera directement exécuté (c’est-à-dire qu’il produira quelques lignes de valeurs).
System.Threading.Thread.Sleep(5000) ;
3. Mettre en pause les événements d’un processus enfant pendant 5 secondes provoquera l’arrêt de réponse de la fenêtre principale pendant 5 secondes
4. Définir une variable statique de thread :
[FilsStatique]
Privé statique int i = 0 ;
Ajoutez un événement à chaque sous-thread, puis cliquez sur la valeur statique du thread pour obtenir la valeur i augmentée
2. Minuteur serveur (System.Timers.Timer)
System.Timers.Timer ne dépend pas des formulaires, réveille les threads du pool de threads, et est une version mise à jour du minuteur traditionnel optimisée pour fonctionner sur un environnement serveur
Il n’y a pas de commandes prêtes à l’emploi dans la boîte à outils VS2005 et doivent être codées manuellement pour utiliser ce minuteur
Il y a deux façons de l’utiliser,
1. Attacher au formulaire via la propriété SynchronizingObject
Minuteries.Minuteries Temporiseurs = nouveau Minuteur. Minuteur() ;
timersTimer.Enabled = false ;
chronomètres Intervalle. = 100 ;
timersTimer.Elapsed += nouveau System.Timers.ElapsedEventHandler(timersTimer_Elapsed) ;
timersTimer.SynchronizingObject = ceci ;
De cette manière, l’expérience fonctionne presque comme un minuteur standard basé sur Windows, sauf que dans la deuxième expérience ci-dessus, bien que l’exécution du sous-thread soit également mise en pause, après 5 secondes toutes les tâches précédemment en file d’attente seront exécutées (c’est-à-dire que quelques lignes de valeur ne manqueront pas).
2. N’utilisez pas la propriété SynchronizingObject
Cette méthode est multithreadée, c’est-à-dire que le thread enfant de départ et la forme principale ne sont pas sur le même thread. Cependant, il y a aussi un problème : puisque le sous-thread est un thread séparé, les contrôles dans le formulaire ne peuvent pas être accessibles, mais ne peuvent être accessibles que via un proxy :
déléguer void SetTextCallback(texte de chaîne) ;
Source : (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Comparaison de trois objets minuteurs dans le blog C#_dash_Sina
。
。
void timersTimer_Elapsed(objet émetteur, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = « exécution de thread enfant, ID thread : » + System.Threading.CurrentThread.ManagedThreadId.ToString() + « \r\n » ;
SetTextCallback d = new SetTextCallback(SetText) ;
Exactement. Invoke(d, nouvel objet[] { texte }) ;
i++ ;
}
void privé SetText (texte en chaîne)
{
lblSubThread.Text += texte ;
}
Ainsi, nous obtiendrons à nouveau les résultats suivants de l’expérience :
1. Lorsque ce minuteur est lancé, l’ID du thread enfant sera affiché dans la liste des ID de thread enfant ci-dessous, et il est différent de l’ID du thread principal
2. Lorsque vous cliquez sur le fil principal pour mettre en pause pendant 5 secondes, le sous-fil continue de s’exécuter (il n’est peut-être pas visible sur l’interface, mais il est facilement visible en sortant le fichier dans le sous-fil)
3. Mettre en pause les événements d’un processus enfant pendant 5 secondes ne rendra pas la fenêtre principale non réactive
4. Ajouter un à la variable statique du thread à chaque fois dans l’événement sous-thread, puis cliquer sur la valeur de la variable statique du thread à 0 ou 0 (cela ne changera pas la variable statique du thread dans la fenêtre principale).
3. Minuteur de threading (System.Threading.Timer)
Les timers de thread ne dépendent pas non plus de formulaires, ce sont des timers simples et légers qui utilisent des méthodes de rappel au lieu d’événements, et sont alimentés par des threads de pool de threads.
Les minuteurs de thread sont utiles dans les situations où les messages ne sont pas envoyés sur des threads.
Voici comment l’utiliser :
System.Threading.Timer threadTimer ;
public void ThreadMethod (État de l’objet)
{
//使用代理
string text = « exécution de thread enfant, ID thread : » + System.Threading.CurrentThread.ManagedThreadId.ToString() + « \r\n » ;
SetTextCallback d = new SetTextCallback(SetText) ;
Exactement. Invoke(d, nouvel objet[] { texte }) ;
i++ ;
}
vide privé Form1_Load(objet émetteur e)
{
threadTimer = nouveau System.Threading.Timer(nouveau System.Threading.TimerCallback(ThreadMethod), null, -1, -1) ;
}
Code de pause :
threadTimer.Change(-1, -1) ;
L’effet de l’expérience est le même que celui de la seconde méthode du minuteur basé sur serveur (System.Timers.Timer),
Bien sûr, les méthodes d’utilisation et principes spécifiques sont différents, le plus important étant que cette méthode utilise la méthode agent au lieu de la méthode événement, et peut être exécutée séparément sans dépendre de formulaires et composants
Voici un tableau résumé par des étrangers (la différence entre les trois méthodes) :
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Prise en charge pour ajouter ou supprimer des auditeurs après l’instanciation du minuteur. Oui Non Oui
Prend en charge les rappels sur le fil d’interface utilisateur Oui Non Oui
Rappels depuis des threads obtenus du pool de threads Oui Oui Non
Prend en charge le glisser-déposer dans le concepteur Windows Forms Oui Non Oui Oui
Adapté pour fonctionner dans un environnement multithread serveur Oui Oui Non
Inclut la prise en charge de la transmission d’un état arbitraire de l’initialisation du minuteur au rappel. Non Oui Non Non
Implémente IDisposable Oui
Prend en compte les rappels ponctuels ainsi que les rappels répétés périodiques. Oui, Oui, Oui
Accessible au-delà des frontières du domaine applicatif Oui
Prend en main IComponent – hébergable dans un IContainer Oui Non Oui |