|
|
Publicēts 12.10.2017 13:12:51
|
|
|

Par taimera klasi C# C# ir trīs taimera klases
1. Definējiet System.Windows.Forms
2. Definēts System.Threading.Timer klasē
3. Definēts System.Timers.Timer klasē
System.Windows.Forms.Timer tiek piemērots WinForm, tas tiek īstenots, izmantojot Windows ziņojumu mehānismu, līdzīgi kā Timer vadīkla VB vai Delphi, un tiek ieviests iekšēji, izmantojot API SetTimer. Tās galvenais trūkums ir tas, ka laiks nav precīzs un ir jābūt ziņojumu cilpai, kas nav pieejama konsoles lietojumprogrammai.
System.Timers.Timer ir ļoti līdzīgs System.Threading.Timer, tie tiek īstenoti, izmantojot .NET Thread Pool, viegls, precīzs laiks, un nav īpašas prasības lietojumprogrammām un ziņojumiem. System.Timers.Timer var lietot arī WinForm, pilnībā aizstājot iepriekš minēto taimera vadīklu. To trūkums ir tāds, ka tie neatbalsta tiešu vilkšanu un nomešanu un prasa manuālu kodēšanu.
Piemērs:
Klases System.Timers.Timer izmantošana
System.Timers.Timer t = jauns System.Timers.Timer(10000); Instancējiet klasi Taimeris un iestatiet intervālu uz 10 000 milisekundēm.
t.Pagājušs += jauns System.Timers.ElapsedEventHandler(theout); Izpildīt notikumus, kad ir sasniegts laiks;
t.AutoReset = true; Iestatīt, vai izpildīt vienu reizi (nepatiess) vai visu laiku (patiess);
t.Enabled = true; vai izpildīt notikumu System.Timers.Timer.Elapused;
public void theout(objekta avots, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("Labi!");
}
Eksperimentāla analīze par līdzībām un atšķirībām starp trīs taimeru izmantošanu C#
http://dotnet.chinaitlab.com/CSharp/737740.html
C# ir pieejami trīs veidu taimeri:
1. Windows standarta taimeris (System.Windows.Forms.Timer)
2. Servera taimeris (System.Timers.Timer)
3. Vītņu taimeris (System.Threading.Timer)
Veiksim dažus nelielus eksperimentus, lai analizētu līdzības un atšķirības starp trim taimeriem, īpaši ar pavedienu saistīto daļu.
Eksperimentālā piemēra ekrānuzņēmums:
1. Standarta Windows taimeris (System.Windows.Forms.Timer)
Pirmā lieta, kas jāatzīmē, ir tas, ka Windows taimeris ir paredzēts viena pavediena vidēm
Šis taimeris ir bijis produktā kopš Visual Basic versijas 1.0 un lielā mērā nav mainījies
Šis taimeris ir visvieglāk lietojams, vienkārši velciet taimera vadīklu no rīklodziņa uz veidlapu un iestatiet rekvizītus, piemēram, notikumus un intervālus
Eksperimentālie rezultāti pilnībā atbilst arī viena vītņa īpašībām:
1. Kad šis taimeris ir startēts, bērna pavediena ID tiks parādīts zemāk esošajā pakārtotā pavediena ID sarakstā, un tas ir tāds pats kā galvenā pavediena ID
privāts tukšums formsTimer_Tick(objekta sūtītājs, EventArgs e)
{
i++;
lblSubThread.Text += "Apakšpavediena izpilde, pavediena ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Kad galvenais pavediens ir apturēts uz 5 sekundēm, bērna pavediens apturēs izpildi, un, ja iepriekš apturētais bērna pavediens netiks izpildīts pēc 5 sekundēm, nākamais bērna pavediens tiks tieši izpildīts (tas ir, tas izvadīs dažas vērtību rindiņas).
Sistēma.Vītne.Pavediens.Miega režīms(5000);
3. Bērna procesa notikumu apturēšana uz 5 sekundēm, galvenais logs 5 sekundes nereaģēs
4. Definējiet pavediena statisko mainīgo:
[ThreadStatic]
privātais statiskais int i = 0;
Pievienojiet vienu katram apakšpavediena notikumam un pēc tam noklikšķiniet uz pavediena statiskā mainīgā vērtības, lai iegūtu palielinātu i vērtību
2. Servera taimeris (System.Timers.Timer)
System.Timers.Timer nav atkarīgs no veidlapām, pamodina pavedienus no pavedienu pūla un ir atjaunināta tradicionālā taimera versija, kas optimizēta darbināšanai servera vidē
VS2005 rīklodziņā nav paredzētas iebūvētas vadības ierīces, un tās ir manuāli jākodē, lai izmantotu šo taimeri
Ir divi veidi, kā to izmantot,
1. Pievienošana veidlapai, izmantojot rekvizītu SynchronizingObject
System.Timers.Timer timersTimer = jauns System.Timers.Timer();
timersTimer.Enabled = false;
taimeriTimer.Interval = 100;
timersTimer.Elapsed += jauns System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = šis;
Tādā veidā eksperiments darbojas gandrīz tāpat kā standarta Windows taimeris, izņemot to, ka otrajā eksperimentā iepriekš, lai gan apakšpavediena izpilde arī tiks apturēta, bet pēc 5 sekundēm tiks izpildīti visi iepriekš rindā esošie uzdevumi (t.i., dažas vērtības rindiņas netrūks).
2. Neizmantojiet rekvizītu SynchronizingObject
Šī metode ir vairāku pavedienu, tas ir, sākuma bērna pavediens un galvenā forma nav vienā un tajā pašā pavedienā. Tomēr pastāv arī problēma: tā kā apakšpavediens ir atsevišķs pavediens, veidlapas vadīklām nevar piekļūt, bet tām var piekļūt tikai ar starpniekserveri:
deleģēt void SetTextCallback(virknes teksts);
Avots: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Trīs taimera objektu salīdzinājums C#_dash_Sina emuārā
。
。
void timersTimer_Elapsed(objekta sūtītājs, System.Timers.ElapsedEventArgs e)
{
//使用代理
virknes teksts = "bērna pavediena izpilde, pavediena ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = jauns SetTextCallback(SetText);
Šis. Invoke(d, jauns objekts[] { teksts });
i++;
}
private void SetText(virknes teksts)
{
lblSubThread.Text += teksts;
}
Tādā veidā mēs atkal iegūsim šādus eksperimenta rezultātus:
1. Kad šis taimeris ir startēts, bērna pavediena ID tiks parādīts zemāk esošajā pakārtotā pavediena ID sarakstā, un tas atšķiras no galvenā pavediena ID
2. Noklikšķinot uz galvenā pavediena, lai pauzētu 5 sekundes, apakšpavediens turpinās darboties (tas var nebūt redzams saskarnē, bet to var viegli redzēt, izvadot failu apakšpavedienā)
3. Bērna procesa notikumu apturēšana uz 5 sekundēm neizraisīs galvenā loga nereaģēšanu
4. Katru reizi apakšpavediena notikumā pievienojiet vienu pavediena statiskajam mainīgajam un pēc tam noklikšķiniet, vai pavediena statiskais mainīgais ir 0 vai 0 vērts (tas nemainīs pavediena statisko mainīgo galvenajā logā).
3. Vītņu taimeris (System.Threading.Timer)
Pavedienu taimeri arī nepaļaujas uz veidlapām, tie ir vienkārši, vienkārši taimeri, kas izmanto atzvanīšanas metodes, nevis notikumus, un tos darbina pavedienu pūla pavedieni.
Pavedienu taimeri ir noderīgi gadījumos, kad ziņojumi netiek sūtīti pavedienos.
Tālāk ir aprakstīts, kā to izmantot.
System.Threading.Timer threadTimer;
public void ThreadMethod(Objekta stāvoklis)
{
//使用代理
virknes teksts = "bērna pavediena izpilde, pavediena ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = jauns SetTextCallback(SetText);
Šis. Invoke(d, jauns objekts[] { teksts });
i++;
}
privāts tukšums Form1_Load(objekta sūtītājs, EventArgs e)
{
threadTimer = jauns System.Threading.Timer(jauns System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Pauzes kods:
threadTimer.Change(-1, -1);
Eksperimenta efekts ir tāds pats kā servera taimeri (System.Timers.Timer) otrais veids,
Protams, konkrētās lietošanas metodes un principi ir atšķirīgi, vissvarīgākais ir tas, ka šī metode izmanto aģenta metodi, nevis notikumu metodi, un to var izpildīt atsevišķi, nepaļaujoties uz veidlapām un komponentiem
Tālāk ir tabula, ko apkopojuši ārzemnieki (atšķirība starp trim metodēm):
Līdzekļu apraksts{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Atbalsts klausītāju pievienošanai un noņemšanai pēc taimera uzstādīšanas. Jā Nē Jā
Atbalsta atzvanīšanu lietotāja interfeisa pavedienā Jā Nē Jā
Atzvana no pavedieniem, kas iegūti no pavedienu kopas Jā Jā Nē
Atbalsta vilkšanu un nomešanu Windows veidlapu noformētājā Jā Nē Jā
Piemērots darbināšanai servera vairāku pavedienu vidē Jā Jā Nē
Ietver atbalstu patvaļīga stāvokļa pārejai no taimera inicializācijas līdz atzvanīšanai. Nē Jā Nē
Ievieš IDisposable Jā Jā Jā
Atbalsta vienreizējus atzvanījumus, kā arī periodiskus atkārtotus atzvanus Jā Jā Jā
Pieejams pāri lietojumprogrammu domēna robežām Jā Jā Jā
Atbalsta IComponent - mitināms IContainer Jā Nē Jā |
Iepriekšējo:c# Lamda izteiksmju kopas atgrupēšana, lai iegūtu minimālo vērtībuNākamo:Linq: Nekad neizmantojiet Count() > 0, lai noteiktu, ka kopa nav tukša
|