|
|
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 erhaltenNächster:Linq: Verwenden Sie niemals Count() > 0, um festzustellen, dass die Menge nicht leer ist
|