Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 18870|Antwoord: 1

[Bron] C#-implementatie van drie timers

[Link kopiëren]
Geplaatst op 12-10-2017 13:12:51 | | |
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




Vorig:c# Lamda-expressieset degroepering om de minimale waarde te nemen
Volgend:Linq: Gebruik nooit Count() > 0 om te bepalen dat de verzameling niet-leeg is
Geplaatst op 08-11-2017 14:02:44 |
Het is waar. Het is echt goed, maar waarom heb je niet op het bericht gereageerd?
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com