|
|
Julkaistu 12.10.2017 13.12.51
|
|
|

Tietoa ajastinluokasta C#:ssa C#:ssa on kolme ajastinluokkaa
1. Määrittele tiedostossa System.Windows.Forms
2. Määritelty System.Threading.Timer -luokassa
3. Määritelty System.Timers.Timer-luokassa
System.Windows.Forms.Timer on käytössä WinFormissa, se toteutetaan Windowsin viestimekanismin kautta, joka muistuttaa VB:n tai Delphin Timer-ohjausta, ja toteutetaan sisäisesti API SetTimerin avulla. Sen suurin haittapuoli on, että ajoitus ei ole tarkka ja viestisilmukka on olemassa, mikä ei ole konsolisovelluksessa saatavilla.
System.Timers.Timer on hyvin samankaltainen kuin System.Threading.Timer, ne toteutetaan .NET Thread Poolin kautta, kevyt ja tarkka ajoitus, eikä sovelluksille tai viesteille ole erityisiä vaatimuksia. System.Timers.Timer voidaan myös soveltaa WinFormiin, korvaten yllä olevan Timer-säätimen kokonaan. Niiden haittapuolena on, etteivät ne tue suoraa vedä-ja-pudota -toimintoa ja vaativat manuaalista koodausta.
Esimerkki:
Käytä System.Timers.Timer -luokkaa
System.Timers.Timer t = uusi System.Timers.Timer(10000); Käynnistä Timer-luokka ja aseta väli 10 000 millisekuntiin.
t.Epast += uusi System.Timers.ElapsedEventHandler(theout); Suorita tapahtumat, kun aika on saavutettu;
t.AutoReset = totta; Aseta, suoritetaanko kerran (epätosi) vai koko ajan (tosi);
t.Enabled = tosi; suoritetaanko System.Timers.Timer.Epast -tapahtuma;
public void theout (object source, System.Timers.ElapsedEventArgs e)
{
MessageBox.Show("OK!");
}
Kokeellinen analyysi kolmen ajastimen käytön samankaltaisuuksista ja eroista C#:ssa
http://dotnet.chinaitlab.com/CSharp/737740.html
C#:ssa on saatavilla kolme erilaista ajastinta:
1. Windows-pohjainen standardiajastin (System.Windows.Forms.Timer)
2. Palvelinpohjainen ajastin (System.Timers.Timer)
3. Threading Timer (System.Threading.Timer)
Käydään läpi pieniä kokeita analysoidaksemme kolmen ajastimen yhtäläisyyksiä ja eroja, erityisesti lankaan liittyvää osaa.
Kokeellisen esimerkin kuvakaappaus:
1. Tavallinen Windows-pohjainen ajastin (System.Windows.Forms.Timer)
Ensimmäinen huomioitava asia on, että Windows Timer on suunniteltu yksisäikeisiin ympäristöihin
Tämä ajastin on ollut tuotteessa Visual Basic -versiosta 1.0 lähtien ja pysynyt pääosin muuttumattomana
Tämä ajastin on helpoin käyttää, vedä vain Timer-ohjaus työkalupakista lomakkeeseen ja aseta ominaisuudet kuten tapahtumat ja intervallit
Kokeelliset tulokset ovat myös täysin yhdenmukaisia yksisäikeisen ominaisuuksien kanssa:
1. Kun ajastin käynnistetään, lapsisäikeen ID näkyy alla olevassa lapsisäikeiden ID-listassa, ja se on sama kuin pääsäikeen ID
private void formsTimer_Tick(objektilähettäjä, EventArgs e)
{
i++;
lblSubThread.Text += "Alisäikeen suoritus, säikeen tunnus:" + System.Threading.CurrentThread.ManagedThreadId.ToString() + "\r\n";
}
2. Kun pääsäie pysäytetään viideksi sekunniksi, lapsisäie keskeyttää suorituksen, ja kun aiemmin keskeytetty lapsisäie ei suoriteta 5 sekunnin jälkeen, seuraava lapsisäie suoritetaan suoraan (eli se tuottaa muutaman rivin arvoja).
System.Threading.Thread.Sleep(5000);
3. Lapsiprosessin tapahtumien pysäyttäminen viideksi sekunniksi saa pääikkunan reagoimattomaksi viideksi sekunniksi
4. Määrittele säikeen staattinen muuttuja:
[ThreadStatic]
yksityinen staattinen älykkyys i = 0;
Lisää yksi jokaiseen alisäikeen tapahtumaan ja klikkaa sitten säikeen staattisen muuttujan arvoa saadaksesi kasvatetun i-arvon
2. Palvelinpohjainen ajastin (System.Timers.Timer)
System.Timers.Timer ei ole riippuvainen lomakkeista, herättää säikeitä säiepoolista ja on päivitetty versio perinteisestä ajastimesta, joka on optimoitu toimimaan palvelinympäristössä
VS2005-työkalupakissa ei ole valmiita ohjaimia, ja ne täytyy koodata manuaalisesti tämän ajastimen käyttöä varten
Sitä voi käyttää kahdella tavalla,
1. Liitä lomakkeeseen SynchronizingObject-ominaisuuden kautta
System.Timers.Timer timersTimer = uusi System.Timers.Timer();
timersTimer.Enabled = epätosi;
timersTimer.Interval = 100;
timersTimer.Elapsed += uusi System.Timers.ElapsedEventHandler(timersTimer_Elapsed);
timersTimer.SynchronizingObject = tämä;
Näin kokeilu toimii lähes samalla tavalla kuin tavallinen Windows-pohjainen ajastin, paitsi että toisessa yllä olevassa kokeessa, vaikka alisäikeen suoritus myös keskeytetään, 5 sekunnin jälkeen kaikki aiemmin jonoon asetetut tehtävät suoritetaan (eli muutama arvorivi ei puutu).
2. Älä käytä SynchronizingObject-ominaisuutta
Tämä menetelmä on monisäikeinen, eli aloituslapsisäie ja päämuoto eivät ole samassa säikeessä. Kuitenkin on myös ongelma: koska alisäie on erillinen säie, lomakkeen ohjaimiin ei pääse käsiksi, vaan niihin pääsee vain välityspalvelimen kautta:
delegate void SetTextCallback (merkkijonoteksti);
Lähde: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Turn) Kolmen ajastinobjektin vertailu C#_dash_Sina-blogissa
。
。
void timersTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//使用代理
string text = "lapsisäikeen suoritus, säikeen ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = uusi SetTextCallback(SetText);
Tämä. Invoke(d, new object[] { text });
i++;
}
private void SetText (merkkijonoteksti)
{
lblSubThread.Text += teksti;
}
Näin saamme kokeesta seuraavat tulokset uudelleen:
1. Kun tämä ajastin käynnistetään, lapsisäikeen ID näkyy alla olevassa lapsisäikeiden ID-listassa, ja se eroaa pääsäikeen ID:stä
2. Kun klikkaat pääsäikettä pysäyttääksesi sen 5 sekunniksi, alisäie jatkaa suoritustaan (se ei välttämättä näy käyttöliittymässä, mutta sen voi helposti nähdä lähettämällä tiedoston alisäikeeseen)
3. Lapsiprosessin tapahtumien pysäyttäminen viideksi sekunniksi ei saa pääikkunaa reagoimattomaksi
4. Lisää yksi säikeen staattiseen muuttujaan joka kerta alisäiketapahtumassa, ja klikkaa sitten, onko säikeen staattinen muuttuja arvoltaan 0 vai 0 (se ei muuta säikeen staattista muuttujaa pääikkunassa).
3. Threading Timer (System.Threading.Timer)
Säikeajastimet eivät myöskään perustu lomakkeisiin, vaan ovat yksinkertaisia, kevyitä ajastimia, jotka käyttävät callback-metodeja tapahtumien sijaan ja saavat virtansa säikeiden allassäikeistä.
Säikeiden ajastimet ovat hyödyllisiä tilanteissa, joissa viestejä ei lähetetä säikeissä.
Näin sitä käytetään:
System.Threading.Timer threadTimer;
public void ThreadMethod (Objektin tila)
{
//使用代理
string text = "lapsisäikeen suoritus, säikeen ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";
SetTextCallback d = uusi SetTextCallback(SetText);
Tämä. Invoke(d, new object[] { text });
i++;
}
private void Form1_Load(objektilähettäjä, EventArgs e)
{
threadTimer = uusi System.Threading.Timer (uusi System.Threading.TimerCallback(ThreadMethod), null, -1, -1);
}
Taukokoodi:
threadTimer.Change(-1, -1);
Kokeen vaikutus on sama kuin palvelinpohjaisen ajastimen toisella tavalla (System.Timers.Timer),
Tietenkin käyttötavat ja -periaatteet ovat erilaisia, tärkeintä on, että tämä menetelmä käyttää agenttimetodia tapahtumametodin sijaan, ja se voidaan suorittaa erikseen ilman lomakkeiden ja komponenttien käyttöä
Seuraava on taulukko, jonka ulkomaalaiset ovat tiivistäneet (kolmen menetelmän ero):
Feature descrip{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer
Tuki kuuntelijoiden lisäämiseen ja poistamiseen ajastimen käyttöönoton jälkeen. Kyllä ei kyllä
Tukee takaisinsoittoja käyttöliittymäsäikeessä Kyllä Ei Kyllä
Takaisinsoitot säikeistä, jotka saatiin säikeiden poolista Kyllä Kyllä Ei
Tukee vedä ja pudota -toimintoa Windows Forms Designerissa Yes No Yes
Sopiva palvelinmonisäikeiseen ympäristöön Kyllä Kyllä Ei
Sisältää tuen mielivaltaisen tilan siirtämiseen ajastimen alustuksesta takaisinsoittoon. Ei kyllä ei
Toteuttaa IDisposable Kyllä Kyllä Kyllä
Tukee yksittäisiä takaisinsoittoja sekä ajoittaisia toistuvia takaisinsoittoja Kyllä Kyllä Kyllä
Saatavilla sovellusalueiden rajojen yli Kyllä Kyllä Kyllä Kyllä
Tukee IComponentia – isännöitävä IContainerissa Kyllä Ei Kyllä |
Edellinen:c# Lamda-lausekejoukon deryhmittely, jotta saadaan minimiarvoSeuraava:Linq: Älä koskaan käytä Count() > 0 määrittääksesi, että joukko ei ole tyhjä
|