Tento článek je zrcadlovým článkem o strojovém překladu, klikněte zde pro přechod na původní článek.

Pohled: 18870|Odpověď: 1

[Zdroj] Implementace tří časovačů v C#

[Kopírovat odkaz]
Zveřejněno 12.10.2017 13:12:51 | | |
O třídě časovače v C# V C# jsou tři třídy časovače

1. Definujte v System.Windows.Forms

2. Definováno ve třídě System.Threading.Timer

3. Definováno v třídě System.Timers.Timer



System.Windows.Forms.Timer je aplikován na WinForm, je implementován prostřednictvím mechanismu zpráv ve Windows, podobně jako ovládání Timer ve VB nebo Delphi, a je implementován interně pomocí API SetTimer. Hlavní nevýhodou je, že načasování není přesné a musí existovat smyčka zpráv, která není dostupná pro konzolovou aplikaci.



System.Timers.Timer je velmi podobný System.Threading.Timer, jsou implementovány prostřednictvím .NET Thread Pool, jsou lehké, mají přesné časování a nemají žádné speciální požadavky na aplikace a zprávy. System.Timers.Timer lze také aplikovat na WinForm a zcela nahradit výše uvedené ovládání Timer. Jejich nevýhodou je, že nepodporují přímé přetahování a vyžadují ruční kódování.



Příklad:

Použijte třídu System.Timers.Timer

System.Timers.Timer t = nový System.Timers.Timer(10000); Instancujte třídu Timer a nastavte interval na 10 000 milisekund.

t.Elapsed += new System.Timers.ElapsedEventHandler(theout); Vykonejte události, jakmile dosáhne potřebného času;

t.AutoReset = pravda; Nastavit, zda se provádí jednou (nepravda) nebo vždy (pravda);

t.Enabled = true; zda spustit událost System.Timers.Timer.Elapsed;



public void theout(object source, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show ("OK!");

}



Experimentální analýza podobností a rozdílů mezi použitím tří časovačů v C#

http://dotnet.chinaitlab.com/CSharp/737740.html



V C# jsou k dispozici tři typy časovačů:


1. Standardní časovač založený na Windows (System.Windows.Forms.Timer)


2. Serverový časovač (System.Timers.Timer)


3. Časovač pro vlákna (System.Threading.Timer)

Pojďme si projít pár malých experimentů, abychom analyzovali podobnosti a rozdíly mezi třemi časovači, zejména tu část týkající se vláken.

Screenshot experimentálního příkladu:



1. Standardní časovač založený na Windows (System.Windows.Forms.Timer)



První věc, kterou je třeba poznamenat, je, že Windows Timer je navržen pro jednovláknová prostředí



Tento časovač je v produktu přítomen od verze Visual Basic 1.0 a zůstal z velké části nezměněn



Tento časovač je nejjednodušší na použití, stačí přetáhnout ovládání Timer z toolboxu do formuláře a nastavit vlastnosti jako události a intervaly



Experimentální výsledky jsou také plně v souladu s charakteristikami jednovláknového vlákenství:



1. Když se tento časovač spustí, ID podvlákna se zobrazí v seznamu ID podvlákna níže a je stejné jako hlavní ID vlákna



private void formsTimer_Tick(object sender, EventArgs e)



{



i++;



lblSubThread.Text += "Provedení podvlákna, ID vlákna:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



}









2. Když je hlavní vlákno pozastaveno na 5 sekund, podvlákno pozastaví vykonání, a když předtím pozastavené podvlákno nebude vykonáno po 5 sekundách, následné podvlákno se vykoná přímo (tedy vygeneruje několik řádků hodnot).



System.Threading.Thread.Sleep(5000);



3. Pozastavení událostí podprocesu na 5 sekund způsobí, že hlavní okno bude na 5 sekund nereagující



4. Definujte statickou proměnnou vlákna:



[VláknoStatic]



soukromý statický int i = 0;



Přidejte jednu do každé podvláknové události a pak klikněte na hodnotu statické proměnné vlákna, abyste získali zvýšenou hodnotu i



2. Serverový časovač (System.Timers.Timer)



System.Timers.Timer nezávisí na formulářích, probouzí vlákna z poolu vláken a je aktualizovanou verzí tradičního časovače optimalizovanou pro provoz na serverovém prostředí



V nástrojové sadě VS2005 nejsou žádné standardní ovládací prvky a je nutné je ručně kódovat pro použití tohoto časovače



Existují dva způsoby, jak ji využít,



1. Připojit se k formuláři pomocí vlastnosti SynchronizingObject



System.Timers.TimersTimersTimer = nový System.Timers.Timer();



timersTimer.Enabled = false;



timersTimer.Interval = 100;



timersTimer.Elapsed += new System.Timers.ElapsedEventHandler(timersTimer_Elapsed);



timersTimer.SynchronizingObject = toto;



Tímto způsobem experiment funguje téměř stejně jako standardní časovač založený na Windows, kromě toho, že ve druhém experimentu výše bude vykonání podvlákna také pozastaveno, ale po 5 sekundách budou vykonány všechny dříve zařazené úkoly (tj. několik řádků hodnoty nebude chybět).



2. Nepoužívejte vlastnost SynchronizingObject



Tato metoda je vícevláknová, tedy počáteční potomek a hlavní forma nejsou na stejném vlákně. Nicméně je tu také problém: protože podvlákno je samostatné vlákno, ovládací prvky ve formuláři nejsou přístupné, ale pouze přes proxy:



delege void SetTextCallback(string text);



Zdroj: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Otoč) Srovnání tří objektů časovače 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);



Přesně tak. Invoke(d, new object[] { text });



i++;



}



private void SetText(string text)



{



lblSubThread.Text += text;



}



Tímto způsobem opět získáme následující výsledky z experimentu:



1. Když se tento časovač spustí, ID podvlákna se zobrazí v seznamu ID podvlákna níže a liší se od hlavního ID vlákna







2. Když kliknete na hlavní vlákno a na 5 sekund pozastavíte, podvlákno bude pokračovat ve spuštění (nemusí být viditelné v rozhraní, ale snadno je vidět při výstupu souboru do podvlákna)



3. Pozastavení událostí podprocesního procesu na 5 sekund nezpůsobí, že hlavní okno přestane odpovídat



4. Přidejte jednu proměnnou do statické proměnné vlákna pokaždé v události podvlákna a poté klikněte, zda má statická proměnná vlákna hodnotu 0 nebo 0 (to nezmění statickou proměnnou vlákna v hlavním okně).



3. Časovač pro vlákna (System.Threading.Timer)



Časovače vláken také nespoléhají na formuláře, jsou jednoduché, lehké časovače, které používají callback metody místo eventů a jsou poháněny vlákny z poolu vláken.



Časovače vláken jsou užitečné v situacích, kdy zprávy nejsou odesílány přímo na vlákna.



Tady je, jak ho používat:



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);



Přesně tak. Invoke(d, new object[] { text });



i++;



}



private void Form1_Load(object sender, EventArgs e)



{



threadTimer = nový System.Threading.Timer(nový System.Threading.TimerCallback(ThreadMethod), null, -1, -1);



}



Kód pauzy:



threadTimer.Change(-1, -1);



Efekt experimentu je stejný jako u druhého způsobu serverového časovače (System.Timers.Timer),



Samozřejmě, konkrétní metody a principy použití se liší, nejdůležitější je, že tato metoda používá agentní metodu místo event metody a může být prováděna samostatně bez závislosti na formulářích a komponentách



Následuje tabulka shrnutá cizinci (rozdíl mezi třemi metodami):



Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer



Podpora přidávání a odebírání posluchačů po spuštění časovače. Ano Ne Ano



Podporuje zpětná volání v uživatelském vlákně Ano Ne Ano



Volání zpět z vláken získaných z vláknového poolu Ano Ano Ne



Podporuje tahání a pouštění v Windows Forms Designer Ano Ne Ano



Vhodné pro provoz v serverovém vícevláknovém prostředí Ano Ano Ne



Zahrnuje podporu pro předávání libovolného stavu od inicializace časovače k callbacku. Ne, ano ne



Implements IDisposable Yes Yes Yes



Podporuje jednorázové callbacky i periodické opakující se callbacky Yes



Přístupné napříč hranicemi aplikační domény: Ano, ano, ano



Podporuje IComponent – hostovatelný v IContainer Yes Ne Yes




Předchozí:c# Lamda množina výrazů se rozděluje na minimální hodnotu
Další:Linq: Nikdy nepoužívejte Count() > 0 k určení, že množina je neprázdná
Zveřejněno 08.11.2017 14:02:44 |
Je to pravda. Je to opravdu dobré, ale proč jsi neodpověděl na příspěvek?
Zřeknutí se:
Veškerý software, programovací materiály nebo články publikované organizací Code Farmer Network slouží pouze k učení a výzkumu; Výše uvedený obsah nesmí být používán pro komerční ani nelegální účely, jinak nesou všechny důsledky uživatelé. Informace na tomto webu pocházejí z internetu a spory o autorská práva s tímto webem nesouvisí. Musíte výše uvedený obsah ze svého počítače zcela smazat do 24 hodin od stažení. Pokud se vám program líbí, podporujte prosím originální software, kupte si registraci a získejte lepší skutečné služby. Pokud dojde k jakémukoli porušení, kontaktujte nás prosím e-mailem.

Mail To:help@itsvse.com