Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 18870|Svar: 1

[Källa] C#-implementering av tre timers

[Kopiera länk]
Publicerad på 2017-10-12 13:12:51 | | |
Om timer-klassen i C# Det finns tre timer-klasser i C#

1. Definiera i System.Windows.Forms

2. Definierad i klassen System.Threading.Timer

3. Definierad i klassen System.Timers.Timer



System.Windows.Forms.Timer tillämpas på WinForm, implementeras via Windows-meddelandemekanismen, liknande Timer-kontrollen i VB eller Delphi, och implementeras internt med API:et SetTimer. Dess största nackdel är att tidpunkten inte är exakt och det måste finnas en meddelandeloop, vilket inte är tillgängligt för konsolapplikationen.



System.Timers.Timer är mycket lik System.Threading.Timer, de implementeras via .NET Thread Pool, är lätta, noggrann timing och har inga särskilda krav på applikationer och meddelanden. System.Timers.Timer kan också appliceras på WinForm, vilket helt ersätter Timer-kontrollen ovan. Deras nackdel är att de inte stödjer direkt dra-och-släpp och kräver manuell kodning.



Exempel:

Använd klassen System.Timers.Timer

System.Timers.Timer t = nytt System.Timers.Timers.Timer(10000); Instansier Timer-klassen och ställ intervallet till 10 000 millisekunder.

t.Elapsed += nytt System.Timers.ElapsedEventHandler(theout); Utför händelser när tiden är inne;

t.AutoReset = sann; Sätt om den ska utföras en gång (falskt) eller hela tiden (sant);

t.Enabled = true; om System.Timers.Timers.Timer.Elapsed-händelsen ska utföras;



public void theout (objektkälla, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("OK!");

}



Experimentell analys av likheter och skillnader mellan användningen av tre timers i C#

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



Det finns tre typer av timers tillgängliga i C#:


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


2. Serverbaserad timer (System.Timers.Timer)


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

Låt oss gå igenom några små experiment för att analysera likheter och skillnader mellan de tre timers, särskilt trådrelaterade delen.

Skärmdump av experimentellt exempel:



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



Det första att notera är att Windows Timer är designad för enkeltrådade miljöer



Denna timer har funnits i produkten sedan Visual Basic version 1.0 och har till stor del förblivit oförändrad



Denna timer är lättast att använda, dra bara Timer-kontrollen från verktygslådan till formuläret och ställ in egenskaper som händelser och intervall



De experimentella resultaten är också helt förenliga med egenskaperna hos enkeltrådning:



1. När denna timer startas visas barntrådens ID i listan över barntråds-ID:n nedan, och det är samma som huvudtrådens ID



privat void formsTimer_Tick(objektavsändare, EventArgs e)



{



i++;



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



}









2. När huvudtråden pausas i 5 sekunder pausar barntråden exekveringen, och när den tidigare pausade barntråden inte körs efter 5 sekunder, kommer den efterföljande barntråden att köras direkt (det vill säga den ger ut några rader med värden).



System.Threading.Thread.Sleep(5000);



3. Om man pausar händelserna i en barnprocess i 5 sekunder blir huvudfönstret oresponsivt i 5 sekunder



4. Definiera en statisk trådvariabel:



[TrådStatisk]



privat statisk int i = 0;



Lägg till ett till varje subtråd-händelse och klicka sedan på trådens statiska variabelvärde för att få det ökade i-värdet



2. Serverbaserad timer (System.Timers.Timer)



System.Timers.Timer är inte beroende av formulär, väcker trådar från trådpoolen och är en uppdaterad version av den traditionella timern optimerad för att köras i en servermiljö



Det finns inga färdiga kontroller i VS2005-verktygslådan och de måste kodas manuellt för att använda denna timer



Det finns två sätt att använda den,



1. Fäst till formuläret via egenskapen SynchronizingObject



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



timersTimer.Enabled = false;



timersTimer.Interval = 100;



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



timersTimer.SynchronizingObject = detta;



På detta sätt fungerar experimentet nästan likadant som en standard Windows-baserad timer, förutom att i det andra experimentet ovan, även om exekveringen av subtråden också pausas, men efter 5 sekunder kommer alla tidigare köade uppgifter att köras (dvs. några rader av värde kommer inte att saknas).



2. Använd inte egenskapen SynchronizingObject



Denna metod är multitrådad, det vill säga att startbarntråden och huvudformen inte är på samma tråd. Det finns dock också ett problem: eftersom subtråden är en separat tråd kan kontrollerna i formuläret inte nås, utan endast via en proxy:



delegera void SetTextCallback (strängtext);



Källa: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Jämförelse av tre timer-objekt i C#_dash_Sina-bloggen









void timersTimer_Elapsed(objektavsändare, System.Timers.ElapsedEventArgs e)



{



//使用代理



strängtext = "barntrådexekvering, tråd-ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = ny SetTextCallback(SetText);



Exakt så. Invoke(d, nytt objekt[] { text });



i++;



}



privat tomrum SetText (strängtext)



{



lblSubThread.Text += text;



}



På detta sätt får vi följande resultat från experimentet igen:



1. När denna timer startas visas barnets tråd-ID i listan över barntråd-ID nedan, och det skiljer sig från huvudtrådens ID







2. När du klickar på huvudtråden för att pausa i 5 sekunder fortsätter undertråden att köras (det kanske inte syns i gränssnittet, men det kan lätt ses genom att skriva ut filen i undertråden)



3. Att pausa händelserna i en barnprocess i 5 sekunder gör inte att huvudfönstret blir oresponsivt



4. Lägg till en till trådens statiska variabel varje gång i subtrådens händelse, och klicka sedan på om trådens statiska variabel är värd 0 eller 0 (det ändrar inte trådens statiska variabel i huvudfönstret).



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



Trådtimers förlitar sig inte heller på formulär, är enkla, lättviktiga timers som använder callback-metoder istället för händelser, och drivs av trådpooltrådar.



Trådtimers är användbara i situationer där meddelanden inte skickas på trådar.



Så här använder du det:



System.Threading.Timer threadTimer;



public void ThreadMethod (Objekttillstånd)



{



//使用代理



strängtext = "barntrådexekvering, tråd-ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = ny SetTextCallback(SetText);



Exakt så. Invoke(d, nytt objekt[] { text });



i++;



}



privat void Form1_Load(objektavsändare, EventArgs e)



{



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



}



Pauskod:



threadTimer.Change(-1, -1);



Effekten av experimentet är densamma som på det andra sättet med den serverbaserade timern (System.Timers.Timer),



Självklart, de specifika användningsmetoderna och principerna skiljer sig åt, det viktigaste är att denna metod använder agentmetoden istället för händelsemetoden, och kan utföras separat utan att förlita sig på former och komponenter



Följande är en tabell sammanfattad av utlänningar (skillnaden mellan de tre metoderna):



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



Stöd för att lägga till och ta bort lyssnare efter att timern har aktiverats. Ja Nej Ja



Stöder återkopplingar i användargränssnittstråden Ja Nej Ja



Återkopplingar från trådar hämtade från trådpoolen Ja Ja Nej



Stöder dra-och-släpp i Windows Forms Designer Ja Nej Ja



Lämplig för att köras i en server-multitrådad miljö Ja Ja Nej



Inkluderar stöd för att överföra godtyckligt tillstånd från timerinitieringen till callbacken. Nej Ja Nej



implementerar IDisposable ja ja ja ja



Stöder enstaka återkopplingar samt periodiska upprepade återkallelser Ja Ja Ja



Tillgänglig över applikationsdomängränser Ja Ja Ja Ja



Stöder IComponent – hostbar i en IContainer Ja Nej Ja




Föregående:c# Lamda-uttryckssetdegruppering för att ta minimivärdet
Nästa:Linq: Använd aldrig Count() > 0 för att avgöra att mängden är icke-tom
Publicerad på 2017-11-08 14:02:44 |
Det är sant. Det är riktigt bra, men varför svarade du inte på inlägget?
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com