Ce este un pool de fire? De ce să folosești pool-uri de fire? Cum să folosești pool-urile de fire?
1. Ce este un pool de fire?
Clasa ThreadPool a .NET Framework oferă un pool de fire care poate fi folosit pentru a executa sarcini, a trimite elemente de lucru, a gestiona I/O asincron, a aștepta în numele altor fire și a gestiona temporizatoarele. Deci, ce este un pool de fire? Pool-ul de fire este de fapt un "pool" care stochează obiecte de fire și oferă câteva metode de bază, cum ar fi setarea numărului minim/maxim de fire de execuție în pool, punerea la coadă a metodelor ce urmează să fie executate etc. ThreadPool este o clasă statică, deci poate fi folosită direct fără a crea obiecte.
2. De ce să folosești pool-uri de fire? Care sunt beneficiile?
Site-ul oficial Microsoft spune următoarele: Multe aplicații creează un număr mare de fire de discuție care sunt în repaus, așteptând să apară evenimente. Există, de asemenea, multe fire care pot intra în hibernare doar pentru a se trezi periodic și a verifica informații despre starea schimbată sau actualizată. Pool-uri de fire, care îți permit să folosești firele mai eficient printr-un pool de fire de lucru gestionat de sistem.
Pe scurt, fiecare fir nou trebuie să ocupe spațiu de memorie și alte resurse, iar cu atât de multe fire noi, multe dintre ele sunt inactive sau așteaptă eliberarea resurselor. Există multe fire care fac doar câteva lucrări mici periodic, cum ar fi reîmprospătarea datelor etc., care sunt prea risipitoare pentru a fi desenate, iar este rar ca un număr mare de fire să izbucnească în programare propriu-zisă și apoi să se termine într-o perioadă scurtă de timp. Prin urmare, a fost propus conceptul de pool-uri de fire. Dacă aplicația face o altă cerere către pool-ul de fire, firul aflat în starea de așteptare este activat și execută sarcina fără a crea un fir nou, ceea ce economisește multă suprasolicitare. Sistemul va distruge automat firele de execuție doar când numărul de fire atinge numărul maxim de fire. Prin urmare, folosirea pool-urilor de fire poate evita costuri mari de creare și distrugere, poate avea performanță și stabilitate mai bune, iar în al doilea rând, dezvoltatorii se pot concentra pe alte sarcini predând firele către managementul sistemului.
3. Cum folosesc pool-urile de fire?
De fapt, pool-urile de fire sunt foarte simple de folosit, după cum urmează
a. Setează pool-ul maxim și minim de fire:
ThreadPool.SetMaxThreads (int workerThreads,int completionPortThreads) Setează numărul de cereri pentru un pool de fire care pot fi active în același timp. Toate cererile mai mari de acest număr vor rămâne în coadă până când firul din pool de fire devine disponibil. Poți seta și numărul minim de fire.
b. Adaugă sarcini în pool-ul de fire:
ThreadPool.QueueUserWorkItem(noul WaitCallback(numele metodei));
sau ThreadPool.QueueUserWorkItem (noul WaitCallback(numele metodei), parametru);
De exemplu, dacă maximum 5 fire din pool-ul de fire execută o metodă de 60 de ori, salariul total pe 5 ani este următorul:
Dacă nu folosești pooling de fire, s-ar putea să fie nevoie să deschizi 60 de fire pentru a executa metoda Run() asincron, ceea ce este o risipă de resurse de spațiu. Acum folosim până la 5 fire de execuție, care pot fi executate în 1 secundă, iar eficiența și performanța sunt foarte bune.
|