|
|
Objavljeno na 12. 10. 2017 13:12:51
|
|
|

O razredu časovnika v C# V C# so trije razredi časovnika
1. Definiraj v System.Windows.Forms
2. Definirano v razredu System.Threading.Timer
3. Definirano v razredu System.Timers.Timer
System.Windows.Forms.Timer je uporabljen v WinFormu, implementiran je preko Windows sporočilnega mehanizma, podobno kot nadzor Timer v VB ali Delphi, in je interno implementiran z API SetTimer. Njegova glavna pomanjkljivost je, da časovni okvir ni natančen in mora obstajati zanka sporočil, ki pa ni na voljo konzolni aplikaciji.
System.Timers.Timer je zelo podoben System.Threading.Timer, implementiran je prek .NET Thread Pool, lahek, z natančnim časovnim usklajevanjem in brez posebnih zahtev za aplikacije in sporočila. System.Timers.Timer je mogoče uporabiti tudi na WinForm, s čimer popolnoma nadomesti zgornji nadzor Timer. Njihova slabost je, da ne podpirajo neposrednega povlecenja in spusti ter zahtevajo ročno kodiranje.
Primer:
Uporabite razred System.Timers.Timer
System.Timers.Timer t = novi System.Timers.Timer(10000); Instancirajte razred Timer in nastavite interval na 10.000 milisekund.
t.Elapsed += novi System.Timers.ElapsedEventHandler(theout); Izvedite dogodke, ko pride čas;
t.AutoReset = resnično; Nastavi, ali se izvaja enkrat (napačno) ali ves čas (res);
t.Enabled = res; ali izvesti dogodek System.Timers.Timer.Elapsed;
public void theout(object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show ("OK!");
}
Eksperimentalna analiza podobnosti in razlik med uporabo treh časovnikov v C#
http://dotnet.chinaitlab.com/CSharp/737740.html
V C# so na voljo tri vrste časovnikov:
1. Standardni časovnik na osnovi Windows (System.Windows.Forms.Timer)
2. Strežniški časovnik (System.Timers.Timer)
3. Časovnik za niti (System.Threading.Timer)
Poglejmo nekaj manjših eksperimentov, da analiziramo podobnosti in razlike med tremi časovniki, še posebej del, povezan z nitmi.
Posnetek zaslona eksperimentalnega primera:
1. Standardni časovnik na osnovi Windows (System.Windows.Forms.Timer)
Prva stvar, ki jo je treba omeniti, je, da je Windows Timer zasnovan za enonitna okolja
Ta časovnik je v izdelku prisoten že od različice Visual Basic 1.0 in je ostal večinoma nespremenjen
Ta časovnik je najlažji za uporabo, preprosto povlecite kontrolo časovnika iz orodjarne v obrazec in nastavite lastnosti, kot so dogodki in intervali
Eksperimentalni rezultati so prav tako popolnoma skladni z značilnostmi enojnega navoja:
1. Ko se ta časovnik zažene, se bo ID otroške niti prikazal v spodnjem seznamu ID-jev otroške niti in je enak kot glavni ID niti
private void formsTimer_Tick(object sender, EventArgs e)
{
i++;
lblSubThread.Text += "Izvajanje podniti, ID niti:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Ko je glavna nit ustavljena za 5 sekund, bo podnit ustavila izvajanje, in ko prej suspendirana podnit ne bo izvedena po 5 sekundah, se bo naslednja podnit neposredno izvedla (torej bo izpisala nekaj vrstic vrednosti).
System.Threading.Thread.Sleep(5000);
3. Če za 5 sekund zaustavite dogodke podprocesa, bo glavno okno za 5 sekund neodzivno
4. Definirajte statično spremenljivko niti:
[ThreadStatic]
zasebni statični int i = 0;
Dodajte eno na vsak dogodek podniti, nato pa kliknite na vrednost statične spremenljivke niti, da dobite povečano vrednost i
2. Strežniški časovnik (System.Timers.Timer)
System.Timers.Timer ne temelji na obrazcih, prebuja niti iz bazena niti in je posodobljena različica tradicionalnega časovnika, optimizirana za delovanje v strežniškem okolju
V orodjarni VS2005 ni vgrajenih kontrol in jih je treba ročno programirati za uporabo tega časovnika
Obstajata dva načina uporabe,
1. Pripnite se na obrazec preko lastnosti SynchronizingObject
System.Timers.TimersTimersTimer = novi System.Timers.Timer();
timersTimer.Enabled = false;
timersTimer.Interval = 100;
timersTimer.Elapsed += novi System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = to;
Na ta način eksperiment deluje skoraj enako kot standardni časovnik na osnovi Windows, razen da se v drugem zgornjem eksperimentu, čeprav bo izvajanje podniti prav tako začasno ustavljeno, po 5 sekundah izvedejo vse prej čakalne naloge (tj. nekaj vrstic vrednosti ne bo manjkalo).
2. Ne uporabljajte lastnosti SynchronizingObject
Ta metoda je večnitna, kar pomeni, da začetna otroška nit in glavna oblika nista na isti niti. Vendar pa obstaja tudi težava: ker je podnit ločena nit, do kontrol v obliki ni mogoče dostopati, temveč le preko proxyja:
delegate void SetTextCallback(string text);
Vir: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Primerjava treh predmetov časovnika v C#_dash_Sina blogu
。
。
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 = novi SetTextCallback(SetText);
to. Invoke(d, new object[] { text });
i++;
}
private void SetText(string text)
{
lblSubThread.Text += besedilo;
}
Na ta način bomo iz eksperimenta ponovno dobili naslednje rezultate:
1. Ko se ta časovnik zažene, se bo ID otroške niti prikazal v spodnjem seznamu ID-jev pod-niti in se razlikuje od glavnega ID-ja niti
2. Ko kliknete na glavno nit za pavzo za 5 sekund, se podnit nadaljuje z izvajanjem (morda ni vidna na vmesniku, a jo lahko enostavno vidite z vnosom datoteke v podnit)
3. Pavza dogodkov podprocesnega procesa za 5 sekund ne bo povzročila, da glavno okno postane neodzivno
4. Vsakič dodajte eno spremenljivko v nit statično spremenljivko v pod-thread dogodku, nato pa kliknite, ali je nit statična spremenljivka vredna 0 ali 0 (to ne bo spremenilo statične spremenljivke niti v glavnem oknu).
3. Časovnik za niti (System.Threading.Timer)
Časovniki niti prav tako ne temeljijo na obrazcih, so preprosti, lahki časovniki, ki uporabljajo callback metode namesto dogodkov, in jih poganjajo niti v bazenu niti.
Časovniki niti so uporabni v primerih, ko sporočila niso poslana na niti.
Tukaj je, kako jo uporabljati:
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 = novi SetTextCallback(SetText);
to. Invoke(d, new object[] { text });
i++;
}
private void Form1_Load(object sender, EventArgs e)
{
threadTimer = nov System.Threading.Timer(novi System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Koda za pavzo:
threadTimer.Change(-1, -1);
Učinek eksperimenta je enak kot pri drugem načinu strežniškega časovnika (System.Timers.Timer),
Seveda so specifične metode uporabe in načela različni, najpomembneje pa je, da ta metoda uporablja agentno metodo namesto dogodkovne metode in jo je mogoče izvajati ločeno brez zanašanja na oblike in komponente
Sledi tabela, ki so jo povzeti tujci (razlika med tremi metodami):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Podpora za dodajanje in odstranjevanje poslušalcev po vzpostavitvi časovnika. Ja Ne Ja
Podpira povratne klice v nit uporabniškega vmesnika Da Ne Da
Klici nazaj iz niti, pridobljenih iz bazena niti, Da Da Ne
Podpira povlecenje in spuščanje v Windows Forms Designer Da Ne Da
Primerno za delovanje v večnitnem okolju strežnika Da Da Ne
Vključuje podporo za prenos poljubnega stanja od inicializacije časovnika do povratnega klica. Ne, da ne
Implements IDisposable Yes Yes Yes
Podpira enkratne povratne klice ter občasne ponavljajoče se povratne klice Yes Yes Da
Dostopno preko meja aplikacijskih domen Da Da Da
Podpira IComponent – gostovanje v IContainerju Yes Ne Da |
Prejšnji:c# Lamda množica izrazov, ki se razdeljuje na najmanjšo vrednostNaslednji:Linq: Nikoli ne uporabljajte Count() > 0 za določitev, da je množica neprazna
|