Čo sa týka triedy časovača v C# V C# sú tri triedy časovača
1. Definuj v System.Windows.Forms
2. Definované v triede System.Threading.Timer
3. Definované v triede System.Timers.Timer
System.Windows.Forms.Timer sa aplikuje na WinForm, implementuje sa prostredníctvom mechanizmu správ Windows, podobne ako ovládanie Timer vo VB alebo Delphi, a je implementovaný interne pomocou API SetTimer. Jeho hlavnou nevýhodou je, že načasovanie nie je presné a musí existovať slučka správ, ktorá nie je dostupná pre konzolovú aplikáciu.
System.Timers.Timer je veľmi podobný System.Threading.Timer, implementuje sa cez .NET Thread Pool, je ľahký, má presné načasovanie a nevyžaduje žiadne špeciálne požiadavky na aplikácie a správy. System.Timers.Timer je možné aplikovať aj na WinForm, čím úplne nahrádza vyššie uvedené ovládanie Timer. Ich nevýhodou je, že nepodporujú priame drag-and-drop a vyžadujú manuálne kódovanie.
Príklad:
Použite triedu System.Timers.Timer
System.Timers.Timer t = nový System.Timers.Timer(10000); Inštancujte triedu Timer a nastavte interval na 10 000 milisekúnd.
t.Elapsed += new System.Timers.ElapsedEventHandler(theout); Vykonať udalosti, keď nastane čas;
t.AutoReset = pravda; Nastav, či sa vykoná raz (nepravda) alebo vždy (pravda);
t.Enabled = true; či spustiť udalosť System.Timers.Timer.Elapsed;
public void theout (object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show ("OK!");
}
Experimentálna analýza podobností a rozdielov medzi použitím trojčasovačov v C#
http://dotnet.chinaitlab.com/CSharp/737740.html
V C# sú dostupné tri typy časovačov:
1. Windowsový štandardný časovač (System.Windows.Forms.Timer)
2. Serverový časovač (System.Timers.Timer)
3. Časovač vlákien (System.Threading.Timer)
Poďme si prejsť niekoľkými malými experimentmi, aby sme analyzovali podobnosti a rozdiely medzi tromi časovačmi, najmä časť týkajúcu sa vlákien.
Snímka obrazovky experimentálneho príkladu:
1. Štandardný časovač založený na Windows (System.Windows.Forms.Timer)
Prvá vec, ktorú treba spomenúť, je, že Windows Timer je navrhnutý pre prostredia s jedným vláknom
Tento časovač je v produkte prítomný už od verzie Visual Basic 1.0 a zostal do veľkej miery nezmenený
Tento časovač je najjednoduchší na používanie, stačí pretiahnuť ovládanie časovača z toolboxu do formulára a nastaviť vlastnosti ako udalosti a intervaly
Experimentálne výsledky sú tiež plne v súlade s charakteristikami jednovláknového vlákienstva:
1. Keď sa tento časovač spustí, ID podvlákna sa zobrazí v zozname ID podvlákna nižšie a je rovnaké ako hlavné ID vlákna
private void formsTimer_Tick(object sender, EventArgs e)
{
i++;
lblSubThread.Text += "Vykonanie podvlákna, ID vlákna:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Keď je hlavné vlákno pozastavené na 5 sekúnd, podvlákno pozastaví vykonávanie a keď sa predtým pozastavené podvlákno po 5 sekundách nevykoná, nasledujúce podvlákno sa vykoná priamo (teda vygeneruje niekoľko riadkov hodnôt).
System.Threading.Thread.Sleep(5000);
3. Pozastavenie udalostí podprocesu na 5 sekúnd spôsobí, že hlavné okno bude na 5 sekúnd nereagovať
4. Definujte statickú premennú vlákna:
[ThreadStatic]
súkromný statický int i = 0;
Pridaj jeden do každej podvláknovej udalosti a potom klikni na hodnotu statickej premennej vlákna, aby si získal zvýšenú hodnotu i
2. Serverový časovač (System.Timers.Timer)
System.Timers.Timer nezávisí od formulárov, prebúdza vlákna z poolu vlákien a je aktualizovanou verziou tradičného časovača optimalizovanou na prevádzku v serverovom prostredí
V nástrojovej skrinke VS2005 nie sú dostupné žiadne hneď po vybalení ovládacie prvky a je potrebné ich manuálne naprogramovať na použitie tohto časovača
Existujú dva spôsoby, ako ho využiť,
1. Pripojte sa k formuláru cez vlastnosť SynchronizingObject
System.Timers.TimersTimersTimer = nový System.Timers.Timer();
timersTimer.Enabled = false;
timersTimer.Interval = 100;
timersTimer.Elapsed += nový System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = toto;
Týmto spôsobom experiment funguje takmer rovnako ako štandardný časovač založený na Windows, s výnimkou toho, že v druhom experimente vyššie, hoci vykonávanie podvlákna bude tiež pozastavené, po 5 sekundách sa spustia všetky predtým zaradené úlohy (t. j. niekoľko riadkov hodnoty nebude chýbať).
2. Nepoužívajte vlastnosť SynchronizingObject
Táto metóda je viacvláknová, teda počiatočné podvlákno a hlavná forma nie sú na tom istom vlákne. Avšak je tu aj problém: keďže podvlákno je samostatné vlákno, ovládacie prvky vo formulári nie sú prístupné, ale prístupné len cez proxy:
delege void SetTextCallback(string text);
Zdroj: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Otočka) Porovnanie troch objektov časovača v 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 = nový SetTextCallback(SetText);
Presne tak. Invoke(d, new object[] { text });
i++;
}
private void SetText (string text)
{
lblSubThread.Text += text;
}
Týmto spôsobom opäť získame nasledujúce výsledky z experimentu:
1. Keď sa tento časovač spustí, ID podvlákna sa zobrazí v zozname ID podvlákna nižšie a je odlišné od hlavného ID vlákna
2. Keď kliknete na hlavné vlákno na pauzu na 5 sekúnd, podvlákno bude pokračovať vo vykonávaní (nemusí byť viditeľné v rozhraní, ale ľahko ho vidieť výstupom súboru do podvlákna)
3. Pozastavenie udalostí podprocesu na 5 sekúnd nespowoduje, že hlavné okno prestane reagovať
4. Pridajte jednu do statickej premennej vlákna zakaždým v podvlákne udalosti a potom kliknite, či má statická premenná vlákna hodnotu 0 alebo 0 (nezmení to statickú premennú vlákna v hlavnom okne).
3. Časovač vlákien (System.Threading.Timer)
Vláknové časovače tiež nespoliehajú na formuláre, sú jednoduché, ľahké časovače, ktoré používajú callback metódy namiesto eventov a sú poháňané vláknami z vláknového poolu.
Časovače vlákien sú užitočné v situáciách, keď sa správy neodosielajú cez vlákna.
Tu je návod, ako ho používať:
System.Threading.Timer threadTimer;
public void ThreadMethod(Object state)
{
//使用代理
string text = "child thread execution, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = nový SetTextCallback(SetText);
Presne tak. Invoke(d, new object[] { text });
i++;
}
súkromný void Form1_Load(odosielateľ objektu, EventArgs e)
{
threadTimer = nový System.Threading.Timer(nový System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Kód pauzy:
threadTimer.Change(-1, -1);
Účinok experimentu je rovnaký ako druhý spôsob serverového časovača (System.Timers.Timer),
Samozrejme, konkrétne metódy a princípy použitia sú odlišné, najdôležitejšie je, že táto metóda používa agentovú metódu namiesto eventovej metódy a môže byť vykonávaná samostatne bez závislosti na formách a komponentoch
Nasleduje tabuľka zhrnutá cudzincami (rozdiel medzi tromi metódami):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Podpora pridávania a odstraňovania poslucháčov po spúšťaní časovača. Áno Nie Áno
Podporuje spätné volania vo vlákne používateľského rozhrania Yes No Yes
Volania späť z vlákien získaných z vláknového poolu Áno Áno Nie
Podporuje drag-and-drop v Windows Forms Designer Áno Nie Áno
Vhodné na spúšťanie v serverovom multithreaded prostredí Áno Áno Nie
Zahŕňa podporu prechodu ľubovoľného stavu od inicializácie časovača k spätnému volaniu. Nie, áno, nie
implementuje IDisposable Yes
Podporuje jednorazové callbacky, ako aj periodické opakujúce sa callbacky Yes
Prístupné naprieč hranicami domény aplikácií Áno Áno Áno Áno
Podporuje IComponent – hostovateľné v IContainer Yes No Yes |