|
|
Postitatud 12.10.2017 13:12:51
|
|
|

C# taimeri klassi kohta C#-s on kolm taimeri klassi
1. Defineeri failis System.Windows.Forms
2. Määratletud System.Threading.Timer klassis
3. Määratletud System.Timers.Timer klassis
System.Windows.Forms.Timer rakendatakse WinFormile, see on rakendatud Windowsi sõnumimehhanismi kaudu, mis sarnaneb VB või Delphi Timer juhtimisele, ning sisemiselt rakendatakse API SetTimer abil. Selle peamine puudus on see, et ajastus pole täpne ja peab olema sõnumitsükkel, mis pole konsoolirakendusel kättesaadav.
System.Timers.Timer on väga sarnane System.Threading.Timeriga, need on rakendatud .NET Thread Pooli kaudu, kerged, täpsed ajastused ning rakendustele ja sõnumitele ei ole erinõudeid. System.Timers.Timer saab rakendada ka WinFormile, asendades täielikult ülaltoodud taimeri juhtimise. Nende puuduseks on see, et nad ei toeta otsest lohistamist ja nõuavad käsitsi kodeerimist.
Näide:
Kasuta System.Timers.Timer klassi
System.Timers.Timer t = uus System.Timers.Timer(10000); Instantsi Timer klass ja sea intervall 10 000 millisekundile.
t.Epast += uus System.Timers.ElapsedEventHandler(theout); Täida sündmusi, kui aeg on käes;
t.AutoReset = tõeline; Määra, kas täita üks kord (vale) või kogu aeg (tõene);
t.Enabled = tõene; kas käivitada System.Timers.Timer.Elapsed sündmus;
public void theout (objekti allikas, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show ("OK!");
}
Kolme taimeri kasutamise sarnasuste ja erinevuste eksperimentaalne analüüs C#-s
http://dotnet.chinaitlab.com/CSharp/737740.html
C#-s on saadaval kolm tüüpi taimereid:
1. Windowsipõhine standardtaimer (System.Windows.Forms.Timer)
2. Serveripõhine taimer (System.Timers.Timer)
3. Lõimimistaimer (System.Threading.Timer)
Vaatame läbi mõned väikesed katsed, et analüüsida kolme taimeri sarnasusi ja erinevusi, eriti niidiga seotud osa.
Eksperimentaalse näite ekraanipilt:
1. Standardne Windowsipõhine taimer (System.Windows.Forms.Timer)
Esimene asi, mida tähele panna, on see, et Windows Timer on loodud ühe lõimega keskkondade jaoks
See taimer on olnud tootes alates Visual Basicu versioonist 1.0 ja on jäänud suuresti muutumatuks
See taimer on kõige lihtsam kasutada, lihtsalt lohista taimeri kontroll tööriistakastist vormi ja sea omadused nagu sündmused ja intervallid
Eksperimentaalsed tulemused on samuti täielikult kooskõlas ühe keermestamise omadustega:
1. Kui see taimer käivitatakse, kuvatakse allpool alamlõime ID nimekirjas alamlõime ID ning see on sama mis põhilõime ID
privaatne void formsTimer_Tick(objekti saatja, EventArgs e)
{
i++;
lblSubThread.Text += "Alamlõime täitmine, lõime ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Kui peamine lõim on pausile pandud 5 sekundiks, peatab alamlõim täitmise ning kui varem peatatud lapslõim ei käivitu 5 sekundi pärast, käivitatakse järgmine lapslõim otse (st väljastab mõned väärtusread).
System.Threading.Thread.Sleep(5000);
3. Lapse protsessi sündmuste peatamine 5 sekundiks põhjustab peaakna reageerimatuks muutumise 5 sekundiks
4. Defineeri lõime staatiline muutuja:
[ThreadStatic]
privaatne staatiline int i = 0;
Lisa iga alamlõime sündmusele üks ja seejärel klõpsa lõime staatilise muutuja väärtusel, et saada suurenenud i väärtus
2. Serveripõhine taimer (System.Timers.Timer)
System.Timers.Timer ei sõltu vormidest, äratab lõimesid lõimede basseinist ning on traditsioonilise taimeri uuendatud versioon, mis on optimeeritud serverikeskkonnas töötamiseks
VS2005 tööriistakastis ei ole olemas automaatseid juhtnuppe ning taimeri kasutamiseks tuleb need käsitsi kodeerida
Seda saab kasutada kahel viisil,
1. Kinnita vormile SynchronizingObject omaduse kaudu
System.Timers.Timer timersTimer = uus System.Timers.Timer();
timersTimer.Enabled = vale;
timersTimer.Interval = 100;
timersTimer.Elapsed += uus System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = see;
Nii töötab katse peaaegu samamoodi nagu tavaline Windowsi taimer, välja arvatud teises ülaltoodud katses, kuigi alamlõime täitmine peatatakse, kuid pärast 5 sekundit täidetakse kõik varem järjekorras olnud ülesanded (st mõned väärtusread ei puudu).
2. Ära kasuta omadust SynchronizingObject
See meetod on mitmelõimeline, st algne lapslõim ja põhivorm ei ole samal lõimel. Siiski on ka probleem: kuna alamlõim on eraldi lõim, ei saa vormi juhtnuppudele ligi, vaid neid saab kasutada ainult proxy kaudu:
delegate void SetTextCallback(string text);
Allikas: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Pööre) Kolme taimeri objekti võrdlus C#_dash_Sina blogis
。
。
void timersTimer_Elapsed(objekti saatja, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "alamlõime täitmine, lõime ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = uus SetTextCallback(SetText);
See. Invoke(d, uus objekt[] { tekst });
i++;
}
private void SetText (string text)
{
lblSubThread.Text += tekst;
}
Nii saame eksperimendist taas järgmised tulemused:
1. Kui see taimer käivitatakse, kuvatakse allpool alamlõime ID nimekirjas alamlõime ID ning see erineb peamisest lõime ID-st
2. Kui klõpsad põhilõimel, et peatada 5 sekundit, jätkab alamlõim käivitust (see ei pruugi liidesel nähtav olla, kuid on lihtne näha, kui faili alamlõimes välja anda)
3. Lapsprotsessi sündmuste peatamine 5 sekundiks ei põhjusta peaakna reageerimatuks muutumist
4. Lisa iga kord alamlõime sündmuses üks lõime staatilisele muutujale ja klõpsa, kas lõime staatiline muutuja on väärt 0 või 0 (see ei muuda lõime staatilist muutujat peaaknas).
3. Lõimimistaimer (System.Threading.Timer)
Lõimetaimerid ei tugine ka vormidele, on lihtsad ja kerged taimerid, mis kasutavad tagasikutsumise meetodeid sündmuste asemel ning mida toidavad lõimede pool.
Lõimetaimerid on kasulikud olukordades, kus sõnumeid lõimedel ei saadeta.
Siin on, kuidas seda kasutada:
System.Threading.Timer threadTimer;
public void ThreadMethod (Objekti seisund)
{
//使用代理
string text = "alamlõime täitmine, lõime ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = uus SetTextCallback(SetText);
See. Invoke(d, uus objekt[] { tekst });
i++;
}
private void Form1_Load(objektisaatja, EventArgs e)
{
threadTimer = uus System.Threading.Timer (uus System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Pausikood:
threadTimer.Change(-1, -1);
Eksperimendi mõju on sama mis serveripõhise taimeri teisel viisil (System.Timers.Timer),
Muidugi on konkreetsed kasutusviisid ja põhimõtted erinevad, kõige olulisem on, et see meetod kasutab agendi meetodit sündmusmeetodi asemel ning seda saab eraldi täita ilma vormide ja komponentide kasutamiseta
Järgmine on tabel, mis on kokku võetud välismaalaste poolt (kolme meetodi erinevus):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Toetus kuulajate lisamiseks ja eemaldamiseks pärast taimeri käivitamist. Jah Ei Jah
Toetab tagasikõnesid kasutajaliidese lõimes Jah Ei Jah
Tagasikõned lõimedest, mis on saadud lõimede poolist Jah Jah Ei
Toetab lohistamist Windows Forms Designeris Yes No Yes
Sobib serveri mitmelõimelise keskkonna käivitamiseks Jah Jah Ei
Sisaldab tuge suvalise oleku edastamiseks taimeri initsialiseerimisest tagasikõneni. Ei, jah, ei
Rakendab IDisposable'i Jah Jah Jah
Toetab ühekordseid tagasikõnesid ning perioodilisi korduvaid tagasikõnesid Jah, Jah, Jah
Ligipääsetav üle rakendusdomeeni piiride Jah Jah Jah Jah
Toetab IComponenti – hostitav IContaineris Yes No Yes |
Eelmine:c# Lamda avaldise hulga degrupeerimine, et võtta minimaalne väärtusJärgmine:Linq: Ära kunagi kasuta Count() > 0, et määrata, et hulk on mitte-tühi
|