Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 18870|Odpoveď: 1

[Zdroj] Implementácia trojnásobných časovačov v C#

[Kopírovať odkaz]
Zverejnené 12. 10. 2017 13:12:51 | | |
Č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




Predchádzajúci:c# Lamda množina výrazov sa rozdeľuje na minimálnu hodnotu
Budúci:Linq: Nikdy nepoužívajte Count() > 0 na určenie, že množina nie je prázdna
Zverejnené 8. 11. 2017 14:02:44 |
Je to pravda. Je to naozaj dobré, ale prečo si neodpovedal na ten príspevok?
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com