|
|
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
|