Cet article est un article miroir de traduction automatique, veuillez cliquer ici pour accéder à l’article original.

Vue: 18870|Répondre: 1

[Source] Implémentation en C# de trois minuteurs

[Copié le lien]
Publié sur 12/10/2017 13:12:51 | | |
À 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




Précédent:C# Dégroupement de l’ensemble d’expressions de Lamda pour prendre la valeur minimale
Prochain:Linq : N’utilisez jamais Count() > 0 pour déterminer que l’ensemble n’est pas vide
Publié sur 08/11/2017 14:02:44 |
C’est vrai. C’est vraiment bien, mais pourquoi n’as-tu pas répondu au post ?
Démenti:
Tous les logiciels, supports de programmation ou articles publiés par Code Farmer Network sont uniquement destinés à l’apprentissage et à la recherche ; Le contenu ci-dessus ne doit pas être utilisé à des fins commerciales ou illégales, sinon les utilisateurs assumeront toutes les conséquences. Les informations sur ce site proviennent d’Internet, et les litiges de droits d’auteur n’ont rien à voir avec ce site. Vous devez supprimer complètement le contenu ci-dessus de votre ordinateur dans les 24 heures suivant le téléchargement. Si vous aimez le programme, merci de soutenir un logiciel authentique, d’acheter l’immatriculation et d’obtenir de meilleurs services authentiques. En cas d’infraction, veuillez nous contacter par e-mail.

Mail To:help@itsvse.com