Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 18870|Atsakyti: 1

[Šaltinis] C# trijų laikmačių diegimas

[Kopijuoti nuorodą]
Paskelbta 2017-10-12 13:12:51 | | |
Apie laikmačio klasę C# Yra trys laikmačio klasės C#

1. Apibrėžkite System.Windows.Forms

2. Apibrėžta System.Threading.Timer klasėje

3. Apibrėžta System.Timers.Timer klasėje



System.Windows.Forms.Timer taikomas WinForm, jis įgyvendinamas naudojant Windows pranešimų mechanizmą, panašų į laikmačio valdiklį VB arba Delphi, ir yra įdiegtas viduje naudojant API SetTimer. Pagrindinis jo trūkumas yra tas, kad laikas nėra tikslus ir turi būti pranešimų ciklas, kurio konsolės programa nepasiekia.



System.Timers.Timer yra labai panašus į System.Threading.Timer, jie įgyvendinami naudojant .NET Thread Pool, lengvą, tikslų laiką ir jokių specialių reikalavimų programoms ir pranešimams. System.Timers.Timer taip pat gali būti taikomas WinForm, visiškai pakeičiant aukščiau pateiktą laikmačio valdiklį. Jų trūkumas yra tas, kad jie nepalaiko tiesioginio nuvilkimo ir reikalauja rankinio kodavimo.



Pavyzdys:

Naudokite System.Timers.Timer klasę

System.Timers.Timer t = naujas System.Timers.Timer(10000); Sukurkite laikmačio klasę ir nustatykite intervalą į 10 000 milisekundžių.

t.Praėjo += naujas System.Timers.ElapsedEventHandler(theout); Vykdyti įvykius, kai pasiekiamas laikas;

t.AutoReset = teisinga; Nustatykite, ar vykdyti vieną kartą (klaidinga), ar visą laiką (teisinga);

t.Enabled = true; ar vykdyti įvykį System.Timers.Timer.Elapused;



public void theout(objekto šaltinis, System.Timers.ElapsedEventArgs e)

{

MessageBox.Show("Gerai!");

}



Eksperimentinė trijų laikmačių naudojimo C# panašumų ir skirtumų analizė

http://dotnet.chinaitlab.com/CSharp/737740.html



C# yra trijų tipų laikmačiai:


1. "Windows" standartinis laikmatis (System.Windows.Forms.Timer)


2. Serverio laikmatis (System.Timers.Timer)


3. Sriegimo laikmatis (System.Threading.Timer)

Atlikime keletą nedidelių eksperimentų, kad išanalizuotume trijų laikmačių, ypač su siūlais susijusios dalies, panašumus ir skirtumus.

Eksperimentinio pavyzdžio ekrano kopija:



1. Standartinis "Windows" laikmatis (System.Windows.Forms.Timer)



Pirmas dalykas, į kurį reikia atkreipti dėmesį, yra tai, kad "Windows" laikmatis skirtas vienos gijos aplinkai



Šis laikmatis buvo produkte nuo "Visual Basic" 1.0 versijos ir iš esmės išliko nepakitęs



Šį laikmatį lengviausia naudoti, tiesiog vilkite laikmačio valdiklį iš įrankių rinkinio į formą ir nustatykite ypatybes, pvz., įvykius ir intervalus



Eksperimento rezultatai taip pat visiškai atitinka vieno sriegio charakteristikas:



1. Paleidus šį laikmatį, antrinės gijos ID bus rodomas žemiau esančiame antrinės gijos ID sąraše ir jis bus toks pat kaip pagrindinės gijos ID



privatus void formsTimer_Tick(objekto siuntėjas, EventArgs e)



{



i++;



lblSubThread.Text += "Posiūlės vykdymas, gijos ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



}









2. Kai pagrindinė gija pristabdoma 5 sekundėms, antrinė gija pristabdys vykdymą, o kai anksčiau sustabdyta antrinė gija nebus vykdoma po 5 sekundžių, paskesnė antrinė gija bus vykdoma tiesiogiai (tai yra, ji išves kelias reikšmių eilutes).



System.Threading.Thread.Sleep(5000);



3. Pristabdžius vaiko proceso įvykius 5 sekundėms, pagrindinis langas 5 sekundes nebereaguos



4. Apibrėžkite gijos statinį kintamąjį:



[ThreadStatic]



privatus statinis int i = 0;



Pridėkite po vieną prie kiekvieno pogijos įvykio, tada spustelėkite gijos statinio kintamojo reikšmę, kad gautumėte padidintą i reikšmę



2. Serverio laikmatis (System.Timers.Timer)



System.Timers.Timer nepriklauso nuo formų, pažadina gijas iš gijų telkinio ir yra atnaujinta tradicinio laikmačio versija, optimizuota veikti serverio aplinkoje



VS2005 įrankių rinkinyje nėra paruoštų valdiklių, todėl juos reikia rankiniu būdu koduoti, kad būtų galima naudoti šį laikmatį



Yra du būdai jį naudoti,



1. Pridėti prie formos naudojant ypatybę SynchronizingObject



System.Timers.Timer timersTimer = naujas System.Timers.Timer();



timersTimer.Enabled = klaidingas;



laikmačiaiTimer.Interval = 100;



timersTimer.Elapsed += naujas System.Timers.ElapsedEventHandler(timersTimer_Elapsed);



timersTimer.SynchronizingObject = tai;



Tokiu būdu eksperimentas veikia beveik taip pat, kaip ir standartinis "Windows" laikmatis, išskyrus tai, kad antrajame aukščiau pateiktame eksperimente, nors pogijos vykdymas taip pat bus pristabdytas, tačiau po 5 sekundžių bus įvykdytos visos anksčiau eilėje esančios užduotys (t.y. netrūks kelių eilučių vertės).



2. Nenaudokite ypatybės SynchronizingObject



Šis metodas yra kelių sriegių, tai yra, pradinis vaiko siūlas ir pagrindinė forma nėra tame pačiame siūle. Tačiau taip pat yra problema: kadangi potemė yra atskira gija, formos valdikliai negali būti pasiekiami, juos galima pasiekti tik per tarpinį serverį:



delegate void SetTextCallback(eilutės tekstas);



Šaltinis: (http://blog.sina.com.cn/s/blog_5aeeb8200100bhc4.html) - (Posūkis) Trijų laikmačio objektų palyginimas C#_dash_Sina tinklaraštyje









void timersTimer_Elapsed(objekto siuntėjas, System.Timers.ElapsedEventArgs e)



{



//使用代理



string text = "antrinės gijos vykdymas, gijos ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = naujas SetTextCallback(SetText);



tai. Invoke(d, naujas objektas[] { tekstas });



i++;



}



privatus void SetText(eilutės tekstas)



{



lblSubThread.Text += tekstas;



}



Tokiu būdu vėl gausime šiuos eksperimento rezultatus:



1. Paleidus šį laikmatį, antrinės gijos ID bus rodomas toliau pateiktame antrinės gijos ID sąraše ir skiriasi nuo pagrindinės gijos ID







2. Kai spustelėsite pagrindinę giją, kad pristabdytumėte 5 sekundes, potemė bus vykdoma toliau (ji gali būti nematoma sąsajoje, bet ją galima lengvai pamatyti išvedus failą į antrinę giją)



3. Pristabdžius vaiko proceso įvykius 5 sekundėms, pagrindinis langas nereaguos



4. Kiekvieną kartą pridėkite vieną prie gijos statinio kintamojo pogijos įvykyje, tada spustelėkite, ar gijos statinis kintamasis yra vertas 0 ar 0 (tai nepakeis gijos statinio kintamojo pagrindiniame lange).



3. Sriegimo laikmatis (System.Threading.Timer)



Gijų laikmačiai taip pat nepriklauso nuo formų, yra paprasti, lengvi laikmačiai, kurie naudoja atgalinio iškvietimo metodus, o ne įvykius, ir yra maitinami gijų telkinio gijomis.



Gijų laikmačiai yra naudingi tais atvejais, kai pranešimai nesiunčiami gijomis.



Štai kaip juo naudotis:



System.Threading.Timer threadTimer;



public void ThreadMethod(Objekto būsena)



{



//使用代理



string text = "antrinės gijos vykdymas, gijos ID:" + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString() + "\r\n";



SetTextCallback d = naujas SetTextCallback(SetText);



tai. Invoke(d, naujas objektas[] { tekstas });



i++;



}



privatus void Form1_Load(objekto siuntėjas, EventArgs e)



{



threadTimer = naujas System.Threading.Timer(naujas System.Threading.TimerCallback(ThreadMethod), nulinis, -1, -1);



}



Pauzės kodas:



threadTimer.Change(-1, -1);



Eksperimento poveikis yra toks pat kaip ir antrojo serverio laikmačio būdo (System.Timers.Timer),



Žinoma, konkretūs naudojimo metodai ir principai yra skirtingi, svarbiausia, kad šis metodas naudoja agento metodą, o ne įvykio metodą, ir gali būti vykdomas atskirai, nepasikliaujant formomis ir komponentais



Toliau pateikiama lentelė, kurią apibendrino užsieniečiai (skirtumas tarp trijų metodų):



Funkcijos aprašymas{filter}tion System.Timers.Timer System.Threading.Timer System.Windows.Forms.Timer



Klausytojų pridėjimo ir pašalinimo palaikymas nustačius laikmatį. Taip Ne Taip



Palaiko atgalinius skambučius vartotojo sąsajos gijoje: Taip Ne Taip



Atgaliniai skambučiai iš gijų, gautų iš gijų telkinio Taip Taip Ne



Palaiko nuvilkimą Windows formų dizaino įrankyje Taip Ne Taip



Tinka veikti serverio kelių gijų aplinkoje Taip Taip Ne



Apima savavališkos būsenos perdavimo palaikymą nuo laikmačio inicijavimo iki atgalinio iškvietimo. Ne Taip Ne



Įgyvendina IDisposable Taip Taip Taip



Palaiko vienkartinius atgalinius skambučius ir periodiškai pasikartojančius atgalinius skambučius Taip Taip Taip



Pasiekiamas per programos domeno ribas Taip Taip Taip



Palaiko "IComponent" – talpinamas "IContainer" Taip Ne Taip




Ankstesnis:c# Lamda išraiškos rinkinio išgrupavimas, kad būtų paimta minimali reikšmė
Kitą:Linq: Niekada nenaudokite Count() > 0, kad nustatytumėte, kad rinkinys nėra tuščias
Paskelbta 2017-11-08 14:02:44 |
Tai tiesa. Tai tikrai gerai, bet kodėl neatsakėte į įrašą?
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com