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 |