Om timerklassen i C# Det finnes tre timerklasser i C#
1. Definer i System.Windows.Forms
2. Definert i System.Threading.Timer-klassen
3. Definert i System.Timers.Timer-klassen
System.Windows.Forms.Timer brukes på WinForm, implementeres gjennom Windows-meldingsmekanismen, lik Timer-kontrollen i VB eller Delphi, og implementeres internt ved bruk av API-et SetTimer. Hovedulempen er at timingen ikke er presis og det må være en meldingssløyfe, som ikke er tilgjengelig for konsollapplikasjonen.
System.Timers.Timer ligner veldig på System.Threading.Timer, de er implementert gjennom .NET Thread Pool, er lettvekts, nøyaktig timing, og uten spesielle krav til applikasjoner og meldinger. System.Timers.Timer kan også brukes på WinForm, og erstatter helt Timer-kontrollen ovenfor. Ulempen deres er at de ikke støtter direkte dra-og-slipp og krever manuell koding.
Eksempel:
Bruk System.Timers.Timer-klassen
System.Timers.Timer t = nytt System.Timers.Timers.Timer(10000); Instansier Timer-klassen og sett intervallet til 10 000 millisekunder.
t.Elapsed += nytt System.Timers.ElapsedEventHandler(theout); Utfør hendelser når tiden er nådd;
t.AutoReset = true; Sett om den skal utføres én gang (falsk) eller hele tiden (sann);
t.Enabled = true; om System.Timers.Timers.Timer.Elapsed-hendelsen skal kjøres;
public void theout (objektkilde, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show ("OK!");
}
Eksperimentell analyse av likheter og forskjeller mellom bruken av tre timere i C#
http://dotnet.chinaitlab.com/CSharp/737740.html
Det finnes tre typer tidtakere tilgjengelig i C#:
1. Windows-basert standardtimer (System.Windows.Forms.Timer)
2. Serverbasert timer (System.Timers.Timer)
3. Trådingstimer (System.Threading.Timer)
La oss gå gjennom noen små eksperimenter for å analysere likhetene og forskjellene mellom de tre timerne, spesielt tråd-relaterte delen.
Skjermbilde av eksperimentelt eksempel:
1. Standard Windows-basert timer (System.Windows.Forms.Timer)
Det første å merke seg er at Windows Timer er designet for enkelttrådede miljøer
Denne timeren har vært til stede i produktet siden Visual Basic versjon 1.0 og har stort sett forblitt uendret
Denne timeren er den enkleste å bruke, bare dra Timer-kontrollen fra verktøykassen til skjemaet, og sett egenskaper som hendelser og intervaller
De eksperimentelle resultatene er også fullt ut konsistente med egenskapene til enkelttråding:
1. Når denne timeren startes, vil barnetråd-ID-en vises i barnetråd-ID-listen nedenfor, og den er den samme som hovedtråd-ID-en
privat void formsTimer_Tick(objektavsender, EventArgs e)
{
i++;
lblSubThread.Text += "Subthread Execution, Thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Når hovedtråden er pauset i 5 sekunder, vil barnetråden pause utførelsen, og når den tidligere suspenderte barnetråden ikke blir utført etter 5 sekunder, vil den påfølgende barnetråden bli direkte utført (det vil si at den vil sende ut noen linjer med verdier).
System.Threading.Thread.Sleep(5000);
3. Å pause hendelsene i en barneprosess i 5 sekunder vil gjøre at hovedvinduet blir uresponsivt i 5 sekunder
4. Definer en statisk trådvariabel:
[TrådStatisk]
privat statisk int i = 0;
Legg til én til hver undertråd-hendelse, og klikk deretter på trådens statiske variabelverdi for å få den økte i-verdien
2. Serverbasert timer (System.Timers.Timer)
System.Timers.Timer er ikke avhengig av skjemaer, vekker tråder fra trådpoolen, og er en oppdatert versjon av den tradisjonelle timeren optimalisert for å kjøre på et servermiljø
Det finnes ingen ferdige kontroller i VS2005-verktøykassen, og de må kodes manuelt for å bruke denne timeren
Det finnes to måter å bruke den på,
1. Fest til skjemaet via egenskapen SynchronizingObject
System.Timers.Timer timersTimer = nytt System.Timers.Timers();
timersTimer.Enabled = false;
timersTimer.Interval = 100;
timersTimer.Elapsed += nytt System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = dette;
På denne måten fungerer eksperimentet nesten som en standard Windows-basert timer, bortsett fra at i det andre eksperimentet ovenfor, selv om kjøringen av undertråden også vil bli pauset, vil alle tidligere kø-oppgaver etter 5 sekunder være utført (dvs. noen få linjer med verdi vil ikke mangle).
2. Ikke bruk egenskapen SynchronizingObject
Denne metoden er multitrådet, det vil si at startbarnetråden og hovedformen ikke er på samme tråd. Det er imidlertid også et problem: siden undertråden er en separat tråd, kan ikke kontrollene i skjemaet nås, men kun via en proxy:
delegate void SetTextCallback (strengtekst);
Kilde: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Sammenligning av tre timerobjekter i C#_dash_Sina-bloggen
。
。
void timersTimer_Elapsed(objektavsender, System.Timers.ElapsedEventArgs e)
{
//使用代理
strengtekst = "child thread execution, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = ny SetTextCallback (SetText);
Dette. Invoke(d, nytt objekt[] { tekst });
i++;
}
privat tomrom SetText (strengtekst)
{
lblSubThread.Text += tekst;
}
På denne måten får vi følgende resultater fra eksperimentet igjen:
1. Når denne timeren startes, vil barnetråd-ID-en vises i barnetråd-ID-listen nedenfor, og den er forskjellig fra hovedtråd-ID-en
2. Når du klikker på hovedtråden for å pause i 5 sekunder, vil undertråden fortsette å kjøre (det er kanskje ikke synlig i grensesnittet, men det kan lett sees ved å skrive ut filen i undertråden)
3. Å pause hendelsene i en barneprosess i 5 sekunder vil ikke føre til at hovedvinduet blir uresponsivt
4. Legg til én til trådens statiske variabel hver gang i undertråd-hendelsen, og klikk deretter på om trådens statiske variabel er verdt 0 eller 0 (det vil ikke endre trådens statiske variabel i hovedvinduet).
3. Trådingstimer (System.Threading.Timer)
Trådtimere er heller ikke avhengige av skjemaer, er enkle, lette timere som bruker callback-metoder i stedet for hendelser, og drives av trådpooltråder.
Trådtimere er nyttige i situasjoner der meldinger ikke sendes på tråder.
Slik bruker du den:
System.Threading.Timer threadTimer;
offentlig void ThreadMethod (Objekttilstand)
{
//使用代理
strengtekst = "child thread execution, thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = ny SetTextCallback (SetText);
Dette. Invoke(d, nytt objekt[] { tekst });
i++;
}
privat void Form1_Load(objektavsender, EventArgs e)
{
threadTimer = nytt System.Threading.Timer (nytt System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Pausekode:
threadTimer.Change(-1, -1);
Effekten av eksperimentet er den samme som den andre metoden med den serverbaserte timeren (System.Timers.Timer),
Selvfølgelig er de spesifikke bruksmetodene og prinsippene forskjellige, det viktigste er at denne metoden bruker agentmetoden i stedet for hendelsesmetoden, og kan utføres separat uten å være avhengig av former og komponenter
Følgende er en tabell oppsummert av utlendinger (forskjellen mellom de tre metodene):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Støtte for å legge til og fjerne lyttere etter at timeren er aktivert. Ja Nei Ja
Støtter tilbakeringinger i brukergrensesnitttråden Ja Nei Ja
Tilbakekall fra tråder hentet fra trådpoolen Ja Ja Nei
Støtter dra-og-slipp i Windows Forms Designer Ja Nei Ja
Egnet for kjøring i et server-multitrådet miljø Ja Ja Nei
Inkluderer støtte for å overføre vilkårlig tilstand fra timerinitialisering til callback. Nei Ja Nei
Implementerer IDisposable Ja Ja Ja
Støtter enkeltstående tilbakeringinger samt periodiske gjentakende tilbakeringinger Yes Yes Yes
Tilgjengelig på tvers av applikasjonsdomenegrenser Ja Ja Ja
Støtter IComponent – hostbar i en IContainer Ja Nei Ja |