Net, crearea de fluxuri secundare

Când crearea programului de fire suplimentare pentru a realiza o unitate de lucru care trebuie urmat procese strict reglementate:

Creați o metodă care este punctul de intrare pentru noul fir.

Creați un fir de obiect, care trece ca un argument ParametrizedThreadStart / ThreadStart designer.

Setați caracteristicile de curgere inițiale (nume, prioritate, etc.).

Cauză metoda Thread.Start (). Acest lucru va începe fluxul în metoda care este specificat delegat, creat în a doua etapă, cât mai curând posibil.

Într-o a doua etapă, este posibil să se utilizeze două tipuri diferite de delegați pentru metoda „indicatii“, care realizează fluxul secundar. Delegat ThreadStart se referă la spațiul de nume System.Threading, deoarece .NET 1.0, și se poate referi la orice metodă care are argumente și returnează nimic. Acest delegat este util atunci când metoda este pur și simplu pentru a rula în fundal, fără nici o altă interacțiune.

ThreadStart limitare evidentă se datorează incapacității de a trece parametrii să-l pentru procesare. Cu toate acestea, ParametrizedThreadStart tip delegat vă permite să trimiteți un singur parametru de tip System.Object. Având în vedere că utilizarea System.Object pare a ceva, puteți trece orice număr de parametri printr-o clasă sau o structură specială. Cu toate acestea, ține cont de faptul că ParametrizedThreadStart delegat poate indica numai metode care returnează nule.

delegat ThreadStart

Pentru a ilustra procesul de construire a unei aplicatii multi-threaded (precum și favoarea sa), presupunem că există o consolă aplicație care permite utilizatorului final să aleagă aplicația își va desfășura activitatea într-un singur flux primar sau de a distribui volumul de muncă pe două fir separat de execuție.

După namespace import System.Threading Următorul pas este de a determina o metodă pentru efectuarea operațiunii (potențială) a debitului secundar. Pentru a se concentreze asupra mecanismului de construcție a programelor multi-threaded, această metodă este pur și simplu pentru a afișa consola o serie de numere, oprindu-se timp de aproximativ 2 secunde la fiecare pas. O definiție completă clasă:

În interiorul Main () în primul rând, utilizatorului i se solicită să decidă cât de multe fire de a utiliza pentru a executa aplicația, una sau două. În cazul în care utilizatorul solicită un flux, este necesar pur și simplu de a provoca ThreadNumbers () metoda în fluxul primar. În cazul în care utilizatorul preferă cele două fluxuri, trebuie să creați un delegat ThreadStart, indicând ThreadNumbers (), treci un obiect delegat pentru constructorul obiectului nou fir și apel Start () metoda de informare CLR că acest flux este gata să proceseze.

Dacă executați acum programul într-un singur fir, descoperim că caseta de mesaj final nu este afișat până când întreaga secvență de numere nu vor fi afișate pe consolă. Pentru că după încheierea fiecărui set o pauză de aproximativ 2 secunde, nu va experiență prea bună pentru utilizatori. Cu toate acestea, dacă selectați două display-uri caseta de mesaj curge imediat, deoarece numerele de ieșire la consolă alocat un fir de obiect unic separat:

Net, crearea de fluxuri secundare

De multe ori, într-un program de multithreaded impune ca fluxul principal a fost ultimul fir termină executarea acestuia. Formal, programul continuă să funcționeze atâta timp cât nu a fost finalizată toate fluxurile sale prioritare. De aceea, cer ca firul principal se termină programul, nu este necesar. Cu toate acestea, această regulă este luată pentru a adera la programarea multi-threaded, deoarece definește în mod clar punctul final al programului.

delegat ParametrizedThreadStart

Amintiți-vă că ThreadStart delegat poate indica doar la metode care returnează nule și nu au nici argumente. În multe cazuri, se potrivește, dar dacă doriți să transferați metoda de date executate într-un fir secundar, trebuie să utilizați delegatului de tip ParametrizedThreadStart.

Să ne uităm la un exemplu:

clasa AutoResetEvent

Mai sigur, deși este de asemenea alternativă nedorită poate fi o provocare Thread.Sleep () pentru o anumită perioadă de timp. Problema este că nu există nici o dorință de a aștepta mai mult decât este necesar.

mod simplu și fir în condiții de siguranță pentru a face un fir de așteptare pentru un alt fir implică utilizarea unei AutoResetEvent de clasă. Fluxul, care trebuie să aștepte (cum ar fi fluxul de metoda principală ()), de a crea o instanță a acestei clase și să dea proiectantul fals, indicând faptul că notificarea a fost până în prezent. La punctul în care doriți să așteptați, apelați metoda WaitOne (). Mai jos este Programul de clasa modificat, ceea ce face cu ajutorul unui AutoResetEvent variabile membru statice:

articole similare