Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 18870|Atbildi: 1

[Avots] C# trīs taimeru ieviešana

[Kopēt saiti]
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ību
Nākamo:Linq: Nekad neizmantojiet Count() > 0, lai noteiktu, ka kopa nav tukša
Publicēts 08.11.2017 14:02:44 |
Tā ir taisnība. Tas ir patiešām labi, bet kāpēc jūs neatbildējāt uz ziņu?
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com