Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 18870|Svar: 1

[Kilde] C#-implementering af tre timere

[Kopier link]
Opslået på 12/10/2017 13.12.51 | | |
Om timerklassen i C# Der er tre timerklasser i C#

1. Definer i System.Windows.Forms

2. Defineret i System.Threading.Timer-klassen

3. Defineret i System.Timers.Timer-klassen



System.Windows.Forms.Timer anvendes på WinForm, implementeres via Windows-meddelelsesmekanismen, ligesom Timer-kontrollen i VB eller Delphi, og implementeres internt via API'en SetTimer. Dens største ulempe er, at timingen ikke er præcis, og der skal være en meddelelsesløkke, som ikke er tilgængelig for konsolapplikationen.



System.Timers.Timer ligner meget System.Threading.Timer, de implementeres gennem .NET Thread Pool, er letvægts, præcis timing og uden særlige krav til applikationer og beskeder. System.Timers.Timer kan også anvendes på WinForm og erstatter fuldstændigt Timer-kontrollen ovenfor. Deres ulempe er, at de ikke understøtter direkte træk-og-slip og kræver manuel kodning.



Eksempel:

Brug System.Timers.Timer-klassen

System.Timers.Timer t = nyt System.Timers.Timers.Timer (10000); Instansier Timer-klassen og sæt intervallet til 10.000 millisekunder.

t.Elapsed += ny System.Timers.ElapsedEventHandler(theout); Udfør begivenheder, når tiden er nået;

t.AutoReset = sand; Sæt om den skal udføres én gang (falsk) eller hele tiden (sand);

t.Enabled = sand; om System.Timers.Timers.Timer.Elapsed-begivenheden skal udføres;



public void theout(objektkilde, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("OK!");

}



Eksperimentel analyse af ligheder og forskelle mellem brugen af tre timere i C#

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



Der findes tre typer timere i C#:


1. Windows-baseret standardtimer (System.Windows.Forms.Timer)


2. Serverbaseret timer (System.Timers.Timer)


3. Trådningstimer (System.Threading.Timer)

Lad os gennemgå nogle små eksperimenter for at analysere ligheder og forskellene mellem de tre timere, især tråd-relaterede delen.

Skærmbillede af eksperimentelt eksempel:



1. Standard Windows-baseret timer (System.Windows.Forms.Timer)



Det første, man skal bemærke, er, at Windows Timer er designet til enkelttrådede miljøer



Denne timer har været til stede i produktet siden Visual Basic version 1.0 og er stort set uændret



Denne timer er den nemmeste at bruge, træk bare Timer-kontrollen fra værktøjskassen til formularen og sæt egenskaber som begivenheder og intervaller



De eksperimentelle resultater er også fuldt ud i overensstemmelse med karakteristikane ved enkeltgevindning:



1. Når denne timer startes, vises børnetrådens ID i børnetrådens ID-liste nedenfor, og det er det samme som hovedtrådens ID



privat void formsTimer_Tick(objektafsender, EventArgs e)



{



i++;



lblSubThread.Text += "Subthread Execution, Thread ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



}









2. Når hovedtråden er sat på pause i 5 sekunder, vil barnetråden pause udførelsen, og når den tidligere suspenderede børnetråd ikke bliver udført efter 5 sekunder, vil den efterfølgende børnetråd blive direkte udført (det vil sige, den vil outputte nogle få linjer med værdier).



System.Threading.Thread.Sleep(5000);



3. Hvis man pauser begivenhederne i en underproces i 5 sekunder, vil hovedvinduet blive uresponsivt i 5 sekunder



4. Definer en trådstatisk variabel:



[ThreadStatisk]



privat statisk int i = 0;



Tilføj én til hver undertrådsbegivenhed, og klik derefter på trådens statiske variabelværdi for at få den øgede i-værdi



2. Serverbaseret timer (System.Timers.Timer)



System.Timers.Timer er ikke afhængig af formularer, vækker tråde fra trådpuljen og er en opdateret version af den traditionelle timer, optimeret til at køre på et servermiljø



Der er ingen standardkontroller i VS2005-værktøjskassen, og de skal kodes manuelt for at bruge denne timer



Der er to måder at bruge det på,



1. Vedhæft til formularen via egenskaben SynchronizingObject



System.Timers.Timer timersTimer = nyt System.Timers.Timers.Timer();



timersTimer.Enabled = false;



timersTimer.Interval = 100;



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



timersTimer.SynchronizingObject = dette;



På denne måde fungerer eksperimentet næsten som en standard Windows-baseret timer, bortset fra at i det andet eksperiment ovenfor, selvom udførelsen af subtråden også vil blive sat på pause, men efter 5 sekunder vil alle tidligere køede opgaver blive udført (dvs. et par linjer af værdi vil ikke mangle).



2. Brug ikke egenskaben SynchronizingObject



Denne metode er multi-trådet, det vil sige, at start-barnetråden og hovedformen ikke er på samme tråd. Der er dog også et problem: da undertråden er en separat tråd, kan kontrollerne i formularen ikke tilgås, men kun tilgås via en proxy:



delegere void SetTextCallback (strengtekst);



Kilde: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Sammenligning af tre timerobjekter i C#_dash_Sina blog









void timersTimer_Elapsed(objektafsender, 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, nyt objekt[] { text });



i++;



}



privat void SetText (strengtekst)



{



lblSubThread.Text += tekst;



}



På denne måde får vi følgende resultater fra eksperimentet igen:



1. Når denne timer startes, vil børnetråd-ID'et blive vist i børnetråd-ID-listen nedenfor, og det er forskelligt fra hovedtrådens ID







2. Når du klikker på hovedtråden for at pause i 5 sekunder, fortsætter undertråden med at køre (det er måske ikke synligt på interfacet, men det kan nemt ses ved at outputte filen i undertråden)



3. At pause begivenhederne i en børneproces i 5 sekunder vil ikke få hovedvinduet til at blive uresponsivt



4. Tilføj én til trådens statiske variabel hver gang i undertrådsbegivenheden, og klik derefter på, om trådens statiske variabel er værd 0 eller 0 (den vil ikke ændre trådens statiske variabel i hovedvinduet).



3. Trådningstimer (System.Threading.Timer)



Trådtimere er heller ikke afhængige af formularer, de er simple, lette timere, der bruger callback-metoder i stedet for events, og drives af trådpooltråde.



Trådtimere er nyttige i situationer, hvor beskeder ikke sendes på tråde.



Sådan bruger du det:



System.Threading.Timer threadTimer;



public 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, nyt objekt[] { text });



i++;



}



privat void Form1_Load(objektafsender, EventArgs e)



{



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



}



Pausekode:



threadTimer.Change(-1, -1);



Effekten af eksperimentet er den samme som den anden metode med den serverbaserede timer (System.Timers.Timer),



Selvfølgelig er de specifikke anvendelsesmetoder og principper forskellige, det vigtigste er, at denne metode bruger agentmetoden i stedet for event-metoden og kan udføres separat uden at være afhængig af former og komponenter



Følgende er en tabel opsummeret af udlændinge (forskellen mellem de tre metoder):



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



Understøttelse af tilføjelse og fjernelse af lyttere efter timeren er aktiveret. Ja Nej Ja



Understøtter callbacks på brugergrænsefladetråden Yes No Yes



Kald tilbage fra tråde hentet fra trådpuljen Ja Ja Nej



Understøtter træk-og-slip i Windows Forms Designer Ja Nej Ja



Egnet til at køre i et server-multitrådet miljø Ja Ja Nej



Inkluderer understøttelse af at overføre vilkårlig tilstand fra timer-initialiseringen til callback. Nej Ja Nej



Implementerer IDisposable ja ja ja ja



Understøtter enkeltstående callbacks samt periodiske gentagne callbacks Yes Yes Yes



Tilgængelig på tværs af applikationsdomænegrænser Ja Ja Ja



Understøtter IComponent – hostbart i en IContainer Ja Nej Ja




Tidligere:c# Lamda-udtryksmængde degruppering for at tage minimumsværdien
Næste:Linq: Brug aldrig Count() > 0 til at afgøre, at mængden er ikke-tom
Opslået på 08/11/2017 14.02.44 |
Det er sandt. Det er virkelig godt, men hvorfor svarede du ikke på opslaget?
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com