Over de timerklasse in C#: Er zijn drie timerklassen in C#
1. Definieer in System.Windows.Forms
2. Gedefinieerd in de System.Threading.Timer-klasse
3. Gedefinieerd in de System.Timers.Timer-klasse
System.Windows.Forms.Timer wordt toegepast op WinForm, wordt geïmplementeerd via het Windows-berichtmechanisme, vergelijkbaar met de Timer-besturing in VB of Delphi, en wordt intern geïmplementeerd via de API SetTimer. Het grootste nadeel is dat de timing niet precies is en er een berichtenlus moet zijn, die niet beschikbaar is voor de Console-applicatie.
System.Timers.Timer lijkt sterk op System.Threading.Timer; ze zijn geïmplementeerd via .NET Thread Pool, lichtgewicht, nauwkeurige timing en zonder speciale eisen voor applicaties en berichten. System.Timers.Timer kan ook worden toegepast op WinForm, waarmee de hierboven genoemde Timer-besturing volledig wordt vervangen. Hun nadeel is dat ze geen directe drag-and-drop ondersteunen en handmatig coderen vereisen.
Voorbeeld:
Gebruik de System.Timers.Timer-klasse
System.Timers.Timer t = nieuwe System.Timers.Timers.Timer(10000); Instansier de Timer-klasse en stel het interval in op 10.000 milliseconden.
t.Elapsed += nieuwe System.Timers.ElapsedEventHandler(theout); Voer gebeurtenissen uit wanneer het moment is bereikt;
t.AutoReset = waar; Stel in of je één keer (onwaar) of altijd moet uitvoeren (waar);
t.Enabled = waar; of het System.Timers.Timer.Elapsed-evenement moet worden uitgevoerd;
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("OK!");
}
Experimentele analyse van de overeenkomsten en verschillen tussen het gebruik van drie timers in C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Er zijn drie soorten timers beschikbaar in C#:
1. Windows-gebaseerde standaardtimer (System.Windows.Forms.Timer)
2. Servergebaseerde timer (System.Timers.Timer)
3. Threadingtimer (System.Threading.Timer)
Laten we enkele kleine experimenten doorlopen om de overeenkomsten en verschillen tussen de drie timers te analyseren, vooral het draad-gerelateerde gedeelte.
Screenshot van experimenteel voorbeeld:
1. Standaard Windows-gebaseerde Timer (System.Windows.Forms.Timer)
Het eerste wat op moet letten is dat Windows Timer is ontworpen voor single-threaded omgevingen
Deze timer is sinds Visual Basic versie 1.0 aanwezig in het product en is grotendeels ongewijzigd gebleven
Deze timer is het makkelijkst te gebruiken, je sleept gewoon de Timer-bediening van de toolbox naar het formulier en stelt eigenschappen in zoals gebeurtenissen en intervallen
De experimentele resultaten zijn ook volledig consistent met de kenmerken van enkelvoudig schroefdraad:
1. Wanneer deze timer wordt gestart, wordt de child thread ID weergegeven in de onderstaande lijst met child thread ID, en dit is hetzelfde als de hoofdthread ID
private void formsTimer_Tick(objectafzender, EventArgs e)
{
i++;
lblSubThread.Text += "Subthread Execution, Thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Wanneer de hoofdthread 5 seconden wordt gepauzeerd, pauzeert de kindthread de uitvoering, en wanneer de eerder onderbroken kindthread na 5 seconden niet wordt uitgevoerd, wordt de volgende kindthread direct uitgevoerd (dat wil zeggen, het geeft een paar regels met waarden uit).
System.Threading.Thread.Sleep(5000);
3. Het pauzeren van de gebeurtenissen van een kindproces voor 5 seconden zorgt ervoor dat het hoofdvenster 5 seconden niet reageert
4. Definieer een statische variabele voor een thread:
[ThreadStatisch]
privé statische int i = 0;
Voeg één toe aan elk subthread-event en klik dan op de statische variabele van de thread om de verhoogde i-waarde te krijgen
2. Servergebaseerde timer (System.Timers.Timer)
System.Timers.Timer is niet afhankelijk van formulieren, wekt threads uit de threadpool en is een bijgewerkte versie van de traditionele timer die geoptimaliseerd is om te draaien op een serveromgeving
Er zijn geen standaard bedieningselementen in de VS2005-toolbox en deze moeten handmatig worden gecodeerd om deze timer te gebruiken
Er zijn twee manieren om het te gebruiken,
1. Koppel aan het formulier via de eigenschap SynchronizingObject
System.Timers.Timer timersTimer = nieuw System.Timers.Timers();
timersTimer.Enabled = false;
timersTimer.Interval = 100;
timersTimer.Elapsed += nieuwe System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = dit;
Op deze manier werkt het experiment vrijwel hetzelfde als een standaard Windows-gebaseerde timer, behalve dat in het tweede experiment hierboven de uitvoering van de subthread ook wordt gepauzeerd, maar na 5 seconden worden alle eerder gequeuede taken uitgevoerd (d.w.z. een paar regels waarde zullen niet ontbreken).
2. Gebruik de eigenschap SynchronizingObject niet
Deze methode is multithreaded, dat wil zeggen dat de start-kindthread en de hoofdvorm niet op dezelfde thread staan. Er is echter ook een probleem: omdat de subthread een aparte thread is, kunnen de besturingselementen in de vorm niet worden benaderd, maar alleen via een proxy:
delegate void SetTextCallback (string text);
Bron: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Draai) Vergelijking van drie timerobjecten in C#_dash_Sina blog
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "child thread execution, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nieuwe SetTextCallback(SetText);
dit. Invoke(d, nieuw object[] { text });
i++;
}
private void SetText (stringtekst)
{
lblSubThread.Text += tekst;
}
Op deze manier krijgen we opnieuw de volgende resultaten van het experiment:
1. Wanneer deze timer wordt gestart, wordt de child thread ID weergegeven in de child thread ID-lijst hieronder, en deze is anders dan de hoofdthread ID
2. Wanneer je op de hoofdthread klikt om 5 seconden te pauzeren, blijft de subthread uitvoeren (het is misschien niet zichtbaar op de interface, maar het is makkelijk te zien door het bestand in de subthread uit te voeren)
3. Het pauzeren van de gebeurtenissen van een kindproces voor 5 seconden zorgt er niet voor dat het hoofdvenster niet meer reageert
4. Voeg er één toe aan de statische threadvariabele elke keer in het subthread-event, en klik dan op of de statische variabele van de thread 0 of 0 waard is (de statische threadvariabele verandert niet in het hoofdvenster).
3. Threadingtimer (System.Threading.Timer)
Threadtimers zijn ook niet afhankelijk van formulieren, zijn eenvoudige, lichte timers die callback-methoden gebruiken in plaats van events, en worden aangedreven door threadpool-threads.
Threadtimers zijn nuttig in situaties waarin berichten niet binnen threads worden verzonden.
Zo gebruik je hem:
System.Threading.Timer threadTimer;
publieke void ThreadMethod (Objecttoestand)
{
//使用代理
string text = "child thread execution, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nieuwe SetTextCallback(SetText);
dit. Invoke(d, nieuw object[] { text });
i++;
}
private void Form1_Load(objectafzender, EventArgs e)
{
threadTimer = nieuwe System.Threading.Timer (nieuwe System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Pauzecode:
threadTimer.Change(-1, -1);
Het effect van het experiment is hetzelfde als de tweede manier van de servergebaseerde timer (System.Timers.Timer),
Natuurlijk zijn de specifieke gebruiksmethoden en principes verschillend, het belangrijkste is dat deze methode de agentmethode gebruikt in plaats van de gebeurtenismethode, en apart kan worden uitgevoerd zonder te vertrouwen op vormen en componenten
Hieronder volgt een tabel samengevat door buitenlanders (het verschil tussen de drie methoden):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Ondersteuning voor het toevoegen en verwijderen van luisteraars nadat de timer is geactiveerd. Ja Nee Ja
Ondersteunt terugroepen op de gebruikersinterface-thread Yes No Yes
Terugroepen van threads verkregen uit de threadpool Ja Ja Nee
Ondersteunt slepen en neerzetten in de Windows Forms Designer Ja Nee Ja
Geschikt voor het draaien in een server-multithreaded omgeving Ja Ja Nee
Bevat ondersteuning voor het doorgeven van willekeurige status van de timerinitialisatie naar de callback. Nee Ja Nee
Implementeert IDisposable Ja Ja Ja
Ondersteunt eenmalige callbacks evenals periodieke terugkerende callbacks Yes Yes Yes
Toegankelijk over de domeingrenzen van applicatie Ja Ja Ja Ja
Ondersteunt IComponent – hostbaar in een IContainer Ja Nee Ja |