Dieser Artikel ist ein Spiegelartikel der maschinellen Übersetzung, bitte klicken Sie hier, um zum Originalartikel zu springen.

Ansehen: 18870|Antwort: 1

[Quelle] C#-Implementierung von drei Timern

[Link kopieren]
Veröffentlicht am 12.10.2017 13:12:51 | | |
Über die Timer-Klasse in C# Es gibt drei Timer-Klassen in C#

1. Definieren Sie in System.Windows.Forms

2. Definiert in der System.Threading.Timer-Klasse

3. Definiert in der System.Timers.Timer-Klasse



System.Windows.Forms.Timer wird auf WinForm angewendet, wird über den Windows-Nachrichtenmechanismus implementiert, ähnlich wie die Timer-Steuerung in VB oder Delphi, und wird intern über die API SetTimer implementiert. Der Hauptnachteil ist, dass das Timing nicht präzise ist und es eine Nachrichtenschleife geben muss, die der Konsolenanwendung nicht zur Verfügung steht.



System.Timers.Timer ist System.Threading.Timer sehr ähnlich, sie werden über den .NET Thread Pool implementiert, sind leicht, präzise und haben keine besonderen Anforderungen an Anwendungen und Nachrichten. System.Timers.Timer kann auch auf WinForm angewendet werden und ersetzt damit die oben genannte Timer-Steuerung vollständig. Ihr Nachteil ist, dass sie kein direktes Drag-and-Drop unterstützen und manuelles Programmieren erfordern.



Beispiel:

Verwenden Sie die System.Timers.Timer-Klasse

System.Timers.Timer t = neues System.Timers.Timer(10000); Instanziere die Timer-Klasse und stelle das Intervall auf 10.000 Millisekunden.

t.Elapsed += neues System.Timers.ElapsedEventHandler(theout); Führe Ereignisse aus, wenn die Zeit erreicht ist;

t.AutoReset = wahr; Setze, ob man einmal (falsch) oder die ganze Zeit (true) ausgeführt werden soll;

t.Enabled = true; ob das System.Timers.Timer.Elapsed-Ereignis ausgeführt werden soll;



public void theout (Objektquelle, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("OK!");

}



Experimentelle Analyse der Ähnlichkeiten und Unterschiede zwischen der Verwendung von drei Timern in C#

http://dotnet.chinaitlab.com/CSharp/737740.html



Es gibt drei Arten von Timern in C#:


1. Windows-basierter Standard-Timer (System.Windows.Forms.Timer)


2. Serverbasierter Timer (System.Timers.Timer)


3. Threading-Timer (System.Threading.Timer)

Lassen Sie uns einige kleine Experimente durchgehen, um die Gemeinsamkeiten und Unterschiede zwischen den drei Timern zu analysieren, insbesondere den threadbezogenen Teil.

Screenshot eines experimentellen Beispiels:



1. Standard-Windows-basierter Timer (System.Windows.Forms.Timer)



Das Erste, was man beachten sollte, ist, dass Windows Timer für Single-Thread-Umgebungen konzipiert ist



Dieser Timer ist seit Visual Basic Version 1.0 im Produkt vorhanden und ist weitgehend unverändert geblieben



Dieser Timer ist am einfachsten zu bedienen, man zieht einfach die Timer-Steuerung aus dem Werkzeugkasten in die Form und stellt Eigenschaften wie Ereignisse und Intervalle ein



Die experimentellen Ergebnisse stimmen ebenfalls vollständig mit den Eigenschaften des Einzelgewindes überein:



1. Wenn dieser Timer gestartet wird, wird die Unterthread-ID in der untenstehenden Kinderthread-ID-Liste angezeigt, und sie ist identisch mit der Hauptthread-ID



private void formsTimer_Tick(Objektsender, EventArgs e)



{



i++;



lblSubThread.Text += "Subthread Execution, Thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



}









2. Wenn der Hauptthread für 5 Sekunden pausiert wird, pausiert der Kindthread die Ausführung, und wenn der zuvor ausgesetzte Kindthread nach 5 Sekunden nicht ausgeführt wird, wird der nachfolgende Kindthread direkt ausgeführt (das heißt, er gibt einige Wertezeilen aus).



System.Threading.Thread.Sleep(5000);



3. Das Pausieren der Ereignisse eines Kindprozesses für 5 Sekunden führt dazu, dass das Hauptfenster für 5 Sekunden nicht mehr reagiert



4. Definiere eine statische Thread-Variable:



[ThreadStatic]



private statische Int i = 0;



Füge jedem Unterthread-Ereignis eins hinzu und klicke dann auf den statischen Wert der Thread-Variable, um den erhöhten i-Wert zu erhalten



2. Serverbasierter Timer (System.Timers.Timer)



System.Timers.Timer hängt nicht von Formularen ab, weckt Threads aus dem Threadpool und ist eine aktualisierte Version des traditionellen Timers, die für den Betrieb in einer Serverumgebung optimiert ist



Im VS2005-Werkzeugkasten gibt es keine fertigen Steuerungen, die manuell programmiert werden müssen, um diesen Timer zu nutzen



Es gibt zwei Möglichkeiten, es zu verwenden,



1. An das Formular über die Eigenschaft SynchronizingObject anhängen



System.Timers.Timer timersTimer = neues System.Timers.Timer();



timersTimer.Enabled = false;



timersTimer.Interval = 100;



timersTimer.Elapsed += neues System.Timers.ElapsedEventHandler(timersTimer_Elapsed);



timersTimer.SynchronizingObject = this;



Auf diese Weise funktioniert das Experiment fast wie ein Standard-Windows-basierter Timer, außer dass im zweiten Experiment oben auch die Ausführung des Subthreads pausiert wird, aber nach 5 Sekunden alle zuvor in der Warteschlange eingeordneten Aufgaben ausgeführt werden (d. h. einige Wertzeilen fehlen nicht).



2. Verwenden Sie nicht die Eigenschaft SynchronizingObject



Diese Methode ist multithreaded, das heißt, der Start-Kind-Thread und die Hauptform befinden sich nicht im selben Thread. Es gibt jedoch auch ein Problem: Da der Unterthread ein separater Thread ist, können die Steuerelemente im Formular nicht abgerufen werden, sondern nur über einen Proxy:



delegate void SetTextCallback (String-Text);



Quelle: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Drehen) Vergleich von drei Timer-Objekten im C#_dash_Sina Blog









void timersTimer_Elapsed(Objektsender, System.Timers.ElapsedEventArgs e)



{



//使用代理



Stringtext = "Kind-Thread-Ausführung, Thread-ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = neuer SetTextCallback(SetText);



das. Invoke(d, neues Objekt[] { text });



i++;



}



privater Void SetText (Stringtext)



{



lblSubThread.Text += Text;



}



Auf diese Weise erhalten wir erneut folgende Ergebnisse aus dem Experiment:



1. Wenn dieser Timer gestartet wird, wird die Childthread-ID in der unten aufgeführten Childthread-ID angezeigt und unterscheidet sich von der Hauptthread-ID







2. Wenn du auf den Hauptthread klickst, um für 5 Sekunden zu pausieren, wird der Unterthread weiter ausgeführt (es ist vielleicht nicht auf der Oberfläche sichtbar, aber es ist leicht sichtbar, indem man die Datei im Subthread ausgibt)



3. Das Anhalten der Ereignisse eines Kindprozesses für 5 Sekunden führt nicht dazu, dass das Hauptfenster nicht mehr reagiert



4. Füge jedes Mal im Unterthread-Event eine zur statischen Thread-Variable hinzu und klicke dann, ob die statische Thread-Variable 0 oder 0 wert ist (im Hauptfenster ändert sich die statische Thread-Variable nicht).



3. Threading-Timer (System.Threading.Timer)



Thread-Timer verlassen sich auch nicht auf Formulare, sind einfache, leichte Timer, die Callback-Methoden statt Ereignisse verwenden, und werden von Threadpool-Threads betrieben.



Thread-Timer sind nützlich in Situationen, in denen Nachrichten nicht auf Threads gesendet werden.



So benutzt man es:



System.Threading.Timer threadTimer;



öffentlicher void ThreadMethod (Objektzustand)



{



//使用代理



Stringtext = "Kind-Thread-Ausführung, Thread-ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = neuer SetTextCallback(SetText);



das. Invoke(d, neues Objekt[] { text });



i++;



}



private Void Form1_Load(Objektsender, EventArgs e)



{



threadTimer = neues System.Threading.Timer (neues System.Threading.TimerCallback(ThreadMethod), null, -1, -1);



}



Pausencode:



threadTimer.Change(-1, -1);



Die Wirkung des Experiments ist dieselbe wie beim zweiten Weg des serverbasierten Timers (System.Timers.Timer),



Natürlich unterscheiden sich die spezifischen Nutzungsmethoden und Prinzipien, das Wichtigste ist, dass diese Methode die Agentenmethode statt der Ereignismethode verwendet und separat ausgeführt werden kann, ohne auf Formen und Komponenten angewiesen zu sein



Im Folgenden eine Tabelle, zusammengefasst von Ausländern (der Unterschied zwischen den drei Methoden):



Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer



Unterstützung zum Hinzufügen und Entfernen von Zuhörern, nachdem der Timer aktiviert wurde. Ja, nein, ja.



Unterstützt Rückrufe im Benutzeroberflächen-Thread Ja Nein Ja



Rückrufe von Threads, die aus dem Threadpool stammen, ja Ja Nein



Unterstützt Drag-and-Drop im Windows Forms Designer Ja Nein Ja



Geeignet für den Betrieb in einer Server-Multithread-Umgebung Ja Ja Nein Nein



Beinhaltet Unterstützung für die Übergabe beliebiger Zustände von der Timer-Initialisierung an den Rückruf. Nein, ja, nein.



implementiert IDisposable Ja Ja Ja



Unterstützt einmalige Rückrufe sowie periodische wiederholende Rückrufe Yes Yes Yes



Barrierefrei über Anwendungsdomänengrenzen hinweg Ja Ja Ja Ja



Unterstützt IComponent – hostbar in einem IContainer Ja Nein Ja




Vorhergehend:c# Lamda-Ausdrucksset-Degruppierung, um den Mindestwert zu erhalten
Nächster:Linq: Verwenden Sie niemals Count() > 0, um festzustellen, dass die Menge nicht leer ist
Veröffentlicht am 08.11.2017 14:02:44 |
Es stimmt. Es ist wirklich gut, aber warum hast du nicht auf den Beitrag geantwortet?
Verzichtserklärung:
Alle von Code Farmer Network veröffentlichten Software, Programmiermaterialien oder Artikel dienen ausschließlich Lern- und Forschungszwecken; Die oben genannten Inhalte dürfen nicht für kommerzielle oder illegale Zwecke verwendet werden, andernfalls tragen die Nutzer alle Konsequenzen. Die Informationen auf dieser Seite stammen aus dem Internet, und Urheberrechtsstreitigkeiten haben nichts mit dieser Seite zu tun. Sie müssen die oben genannten Inhalte innerhalb von 24 Stunden nach dem Download vollständig von Ihrem Computer löschen. Wenn Ihnen das Programm gefällt, unterstützen Sie bitte echte Software, kaufen Sie die Registrierung und erhalten Sie bessere echte Dienstleistungen. Falls es eine Verletzung gibt, kontaktieren Sie uns bitte per E-Mail.

Mail To:help@itsvse.com