Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 18870|Svare: 1

[Kilde] C#-implementering av tre timere

[Kopier lenke]
Publisert på 12.10.2017 13:12:51 | | |
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




Foregående:c# Lamda-uttrykkssettdegruppering for å ta minimumsverdien
Neste:Linq: Bruk aldri Count() > 0 for å avgjøre at mengden er ikke-tom
Publisert på 08.11.2017 14:02:44 |
Det er sant. Det er veldig bra, men hvorfor svarte du ikke på innlegget?
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com