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 |