Despre clasa timer din C# Există trei clase timer în C#
1. Definește în System.Windows.Forms
2. Definit în clasa System.Threading.Timer
3. Definit în clasa System.Timers.Timer
System.Windows.Forms.Timer este aplicat pe WinForm, este implementat prin mecanismul de mesaje Windows, similar cu controlul Timer din VB sau Delphi, și este implementat intern folosind API-ul SetTimer. Principalul dezavantaj este că sincronizarea nu este precisă și trebuie să existe o buclă de mesaje, care nu este disponibilă pentru Aplicația de Consolă.
System.Timers.Timer este foarte asemănător cu System.Threading.Timer, fiind implementat prin .NET Thread Pool, cu o sincronizare ușoară, precisă și fără cerințe speciale pentru aplicații și mesaje. System.Timers.Timer poate fi aplicat și în WinForm, înlocuind complet controlul Timer de mai sus. Dezavantajul lor este că nu suportă drag-and-drop direct și necesită codare manuală.
Exemplu:
Folosește clasa System.Timers.Timer
System.Timers.Timer t = noul System.Timers.Timer(10000); Instanțiază clasa Timer și setează intervalul la 10.000 de milisecunde.
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); Execută evenimentele când se ajunge la timp;
t.AutoReset = adevărat; Setează dacă se execută o dată (fals) sau tot timpul (adevărat);
t.Activat = adevărat; dacă să execute evenimentul System.Timers.Timer.Elapsed;
public void theout (sursa obiectului, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("OK!");
}
Analiză experimentală a asemănărilor și diferențelor dintre utilizarea celor trei cronometrați în C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Există trei tipuri de cronometrate disponibile în C#:
1. Temporizator standard bazat pe Windows (System.Windows.Forms.Timer)
2. Temporizator bazat pe server (System.Timers.Timer)
3. Temporizator de threading (System.Threading.Timer)
Hai să trecem prin câteva experimente mici pentru a analiza asemănările și diferențele dintre cele trei timere, în special partea legată de fire.
Captură de ecran a unui exemplu experimental:
1. Temporizator standard bazat pe Windows (System.Windows.Forms.Timer)
Primul lucru de remarcat este că Windows Timer este conceput pentru medii single-threaded
Acest cronometru este prezent în produs încă din Visual Basic versiunea 1.0 și a rămas în mare parte neschimbat
Acest cronometru este cel mai ușor de folosit, pur și simplu tragi controlul Timerului din toolbox în formular și setezi proprietățile precum evenimentele și intervalele
Rezultatele experimentale sunt, de asemenea, pe deplin consistente cu caracteristicile filetării simple:
1. Când acest cronometru este pornit, ID-ul firului copil va fi afișat în lista ID-urilor firului copil de mai jos și este același cu ID-ul firului principal
private void formsTimer_Tick(object sender, EventArgs e)
{
i++;
lblSubThread.Text += "Execuție subthread, ID thread:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Când firul principal este pus pe pauză pentru 5 secunde, firul copil va pune execuția pe pauză, iar când firul copil suspendat anterior nu va fi executat după 5 secunde, firul copil următor va fi executat direct (adică va genera câteva linii de valori).
System.Threading.Thread.Sleep(5000);
3. Pauză a evenimentelor unui proces copil timp de 5 secunde va face ca fereastra principală să devină nereceptivă timp de 5 secunde
4. Definiți o variabilă statică a firului de execuție:
[Fir static]
static privat int i = 0;
Adaugă câte unul la fiecare eveniment subthread, apoi dă click pe valoarea variabilei statice a firului pentru a obține valoarea i crescută
2. Temporizator bazat pe server (System.Timers.Timer)
System.Timers.Timer nu depinde de forme, trezește firele din pool-ul de fire și este o versiune actualizată a timerului tradițional, optimizată pentru a rula pe un mediu server
Nu există controale standard în trusa VS2005 și trebuie codificate manual pentru a folosi acest cronometru
Există două moduri de a-l folosi,
1. Atașează la formular prin proprietatea SynchronizingObject
System.Timers.Timer timers Timer = noul System.Timers.Timer();
timersTimer.Enabled = false;
timersTimer.Interval = 100;
timersTimer.Elapsed += nou System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = aceasta;
În acest fel, experimentul funcționează aproape la fel ca un cronometru standard bazat pe Windows, cu excepția faptului că în al doilea experiment de mai sus, deși execuția subthread-ului va fi de asemenea pusă pe pauză, după 5 secunde toate sarcinile anterior puse în coadă vor fi executate (adică câteva linii de valoare nu vor lipsi).
2. Nu folosiți proprietatea SynchronizingObject
Această metodă este multi-threaded, adică firul de start copil și forma principală nu sunt pe același fir. Totuși, există și o problemă: deoarece subthread-ul este un fir separat, controalele din formular nu pot fi accesate, ci pot fi accesate doar printr-un proxy:
delegate void SetTextCallback(string text);
Sursa: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Comparație a trei obiecte timer în blogul C#_dash_Sina
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "executarea firului copil, ID fir:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = new SetTextCallback(SetText);
Asta. Invoce(d, obiect nou[] { text });
i++;
}
privat void SetText (text șir de replici)
{
lblSubThread.Text += text;
}
Astfel, vom obține din nou următoarele rezultate din experiment:
1. Când acest cronometru este pornit, ID-ul firului copil va fi afișat în lista ID-urilor firului copil de mai jos și este diferit de ID-ul firului principal
2. Când dai click pe firul principal pentru a pune pauză 5 secunde, subfirul va continua să ruleze (poate să nu fie vizibil pe interfață, dar poate fi ușor observat prin trimiterea fișierului în sub-fir)
3. Pauza evenimentelor unui proces copil timp de 5 secunde nu va face ca fereastra principală să devină nereceptivă
4. Adaugă unul la variabila statică a firului de fiecare dată în evenimentul sub-fir, apoi apasă dacă variabila statică a firului valorează 0 sau 0 (nu va schimba variabila statică a firului din fereastra principală).
3. Temporizator de threading (System.Threading.Timer)
Temporizatoarele de fire nu se bazează nici pe formulare, sunt timere simple și ușoare care folosesc metode de callback în loc de evenimente și sunt alimentate de fire de tip pool thread.
Temporizatoarele de thread sunt utile în scenarii în care mesajele nu sunt trimise pe fire.
Iată cum să o folosești:
System.Threading.Timer threadTimer;
public void ThreadMethod(Starea obiectului)
{
//使用代理
string text = "executarea firului copil, ID fir:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = new SetTextCallback(SetText);
Asta. Invoce(d, obiect nou[] { text });
i++;
}
private void Form1_Load(object sender, EventArgs e)
{
threadTimer = noul System.Threading.Timer(noul System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Cod de pauză:
threadTimer.Change(-1, -1);
Efectul experimentului este același ca al celei de-a doua metode a timerului bazat pe server (System.Timers.Timer),
Desigur, metodele și principiile specifice de utilizare sunt diferite, cel mai important este că această metodă folosește metoda agent în loc de metoda evenimentului și poate fi executată separat fără a depinde de forme și componente
Următorul este un tabel rezumat de străini (diferența dintre cele trei metode):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Suport pentru adăugarea și eliminarea ascultătorilor după ce cronometrul este instanțiat. Da Nu Da Da
Suportă apeluri înapoi în firul de discuție al interfeței utilizatorului Da Nu Da
Apeluri înapoi din firele obținute din pool-ul de fire Da, Da, Nu
Suportă drag-and-drop în Windows Forms Designer. Da, Nu.
Potrivit pentru rularea într-un mediu server-multithreaded Da, Da, Nu
Include suport pentru transmiterea stării arbitrare de la inițializarea timerului la callback. Nu, da, nu
Implementează IDisposable Da Da Da Da
Suportă callback-uri unice, precum și callback-uri periodice repetitive: Da, Da, Da.
Accesibil peste granițele domeniilor aplicației Da Da Da Da
Suportă IComponent – găzduibil într-un IContainer Da, Nu, Da |