, metode de sarcină de așteptare Net

În exemplele de firul principal articol anterior de execuție, o metodă în mod substanțial main (), finalizat deoarece acest rezultat este garantat Thread.Sleep metoda () apeluri. Dar această abordare nu este satisfăcătoare.

Organizarea de așteptare sarcini pot fi completate și mod mai perfectă, folosind metode de așteptare prevăzute în mod specific în sarcina de clasă. Cel mai simplu dintre acestea este considerată metodă Așteptați (). să suspende executarea firului de asteptare până atunci, până la finalizarea sarcinii de asteptare.

La efectuarea acestei metode poate fi generată de două excepții. Prima dintre acestea este ObjectDisposedException de excludere. Acesta este generat în cazul în care sarcina este eliberată prin apelarea Se va elimina (). O a doua excepție, AggregateException. Acesta este generat atunci când sarcina în sine aruncă o excepție sau se anulează. De regulă, acesta este monitorizat și procesat de această excepție.

Datorită faptului că problema nu poate genera o excepție, dacă, de exemplu, a generat problema, toate aceste excepții se colectează într-un singur tip de AggregateException eliminare. Pentru a afla ce sa întâmplat cu adevărat, suficientă pentru a analiza excepția interne, legate de excepție cumulativă. Până atunci, în următoarele exemple, orice excepție generată de sarcini vor fi procesate în timpul rulării.

Ceea ce urmează este o versiune a programului de la articolul anterior, modificat pentru a demonstra aplicarea metodei Așteptare () în practică. Această metodă este folosită în metoda principală (), suspendarea executării până la până la finalizat ambele sarcini task1 și task2:

, metode de sarcină de așteptare Net

Astfel cum rezultă din rezultatul de mai sus, performanța metodei de principal () se suspendă până la finalizat până când ambele sarcini task1 și task2. Cu toate acestea, trebuie amintit că, la acest program este o secvență de finalizare sarcini de activitate și task2 nu contează prea mult pentru metoda de apel Așteptați (). Deci, în cazul în care prima sarcină este finalizată task2, metoda suna task1.Wait () va fi în continuare de așteptat sarcina de finalizare task1. Într-un astfel de caz, metoda de apel task2.Wait () vor executa și întoarcerea imediată a acestuia ca sarcină task2-a fost finalizată.

În acest caz, două apeluri este suficient Așteptați metoda (), dar în același rezultat poate fi obținut într-un mod mai simplu, folosind metoda WaitAll (). Această metodă organizează un grup de așteptare pentru finalizarea sarcinilor. Întoarcerea de la ea nu se va întâmpla atâta timp cât toate sarcinile sunt finalizate.

Sarcini care necesită parametru de finalizare așteptat este transmis printr-o matrice de sarcini. Și, din moment ce acest parametru se referă la tipul de params, atunci această metodă poate fi separat trece o serie de obiecte de tipul de activități sau lista de sarcini. Acest lucru poate fi generat de diverse excepții, inclusiv AggregateException.

Organizarea finalizarea de așteptare a mai multor sarcini ar trebui să fie deosebit de atent pentru a evita interblocările. De exemplu, în cazul în care două sarcini așteaptă finalizarea reciproc, atunci metoda de apel WaitAll () nu duce la o întoarcere de la ea.

Desigur, condițiile de impasuri apar ca urmare a unor erori de programare pentru a fi evitate. Prin urmare, în cazul în care metoda de apel WaitAll () nu se întoarce de la ea, este necesar să se analizeze cu atenție dacă două sau mai multe goluri interblocate. (Tonuri de așteptare (), care nu duce la o revenire a acesteia, poate provoca, de asemenea, un impas).

Sarcinile care necesită finalizarea așteptat transmise prin intermediul unui șir de parametri obiecte de astfel de sarcini lista de sarcini de sarcini sau argumente de tip separate. Aceasta metoda returneaza indicele problemei, care completează primul. Acest lucru poate fi generat de diverse excepții. Încercați WaitAny () metoda în practică, prin substituirea următorul apel în programul anterior:

Acum, punerea în aplicare a metodei principale () pentru a relua, iar programul este finalizat, de îndată ce una dintre cele două sarcini. Pe lângă formele luate în considerare aici metode Stai (), WaitAll () și WaitAny (), există și alte variante ale acestora, care pot fi specificate perioadă de inactivitate sau semnul pistă de demisie.

Evacuarea) Metoda (

Aruncați () metoda este implementată în clasa de sarcini, eliberând resursele folosite de această clasă. De obicei, de resursele asociate cu clasa de sarcini, în mod automat în timpul eliberat „de colectare a gunoiului“ (sau la sfârșitul programului). Însă dacă aceste resurse trebuie să fie lansat chiar mai devreme, în acest scop se elimina () metoda. Acest lucru este deosebit de important în acele programe care au generat un număr mare de sarcini care urmează să fie lăsate să se descurce singuri.

Cu toate acestea, trebuie amintit că metoda va elimina () poate fi apelată la o anumită sarcină numai după finalizarea acesteia. De aceea, pentru a clarifica faptul finaliza o anumită sarcină înainte de a apela metoda se elimina () va necesita un mecanism, de exemplu, o metodă de apel de așteptare (). De aceea, metoda de așteptare () a fost considerată ca fiind importantă pentru a discuta înainte de a se elimina metoda (). Dacă încercăm să numim Eliminați () pentru InvalidOperationException încă sarcini active vor fi aruncate.