Determinarea stării

880 Partea II. C # bibliotecă

Dacă metoda Abort () este apelată cu un argument zero în acest exemplu de program, cererea pentru o întrerupere prematura este anulată de firul care apelează metoda ResetAbort (). iar execuția acestui flux continuă. Orice altă valoare a argumentului va întrerupe fluxul.







Suspendarea și reluarea fluxului

Versiunile inițiale flux NET Framework ar putea suspenda mediul Thread.Suspend metoda de apel () și reia metoda fir de apel. Reluați (). Dar acum ambele metode sunt considerate învechite și nu sunt recomandate pentru utilizarea în noul cod. Acest lucru se explică, în special, cele care folosesc suspend () casa meto- este de fapt sigur, deoarece cu el puteți suspenda firul care deține în prezent de blocare care împiedică retragerea sa și, prin urmare, conduce la un impas . Utilizarea ambelor metode poate provoca complicații grave la nivelul sistemului. Prin urmare, alte instrumente de sincronizare, inclusiv un mutex și un semafor, ar trebui folosite pentru a întrerupe și a relua fluxul.

Starea firului poate fi obținută din proprietatea ThreadState disponibilă în clasa Thread. Mai jos este forma generală a acestei proprietăți.

public ThreadState ThreadState

Starea firului este returnată ca valoare specificată în enumerarea ThreadState. Mai jos sunt valorile definite în această listare.

Toate aceste valori nu necesită explicații speciale, cu excepția unei singure explicații. Valoarea ThreadState.WaitSleepJoin denotă o stare în care fluxul trece în timp ce așteaptă în legătură cu metoda de Așteptare apel (), Sleep () sau Join ().

Aplicarea firului principal

Așa cum am explicat la începutul acestui capitol, fiecare program din C # are cel puțin un fir de execuție, numit firul principal. Acest program primește fluxul automat de îndată ce începe executarea. Firul principal poate fi tratat în același mod ca și cu toate celelalte fire.

Pentru a accesa firul principal, trebuie să obțineți un obiect Thread care îl referă. Aceasta se face folosind proprietatea CurrentThread, care este membru al clasei Thread. Mai jos este forma generală a acestei proprietăți.

statică publică Thread CurrentThread

Capitolul 23. Programarea cu mai multe fire. Partea I: Elementele de bază

Această proprietate returnează o referință la firul în care este utilizată. Prin urmare, dacă proprietatea CurrentThread este utilizată atunci când executați codul în firul principal, îl puteți folosi pentru a obține o legătură cu fluxul principal. Având o astfel de legătură la dispoziția dvs., puteți gestiona firul principal la fel ca orice alt fir.

// Demonstrați gestionarea firului principal.

clasa UseMain // Obțineți firul principal. Thrd = Thread.CurrentThread;

// Afișează numele firului principal. dacă (Thrd.Name == null)

Console.WriteLine ("firul principal nu are un nume."); altfel

Console.WriteLine ("Fișierul principal este numit:" + Thrd.Name);

// Afișează prioritatea firului principal.

// Setați numele și prioritatea. Console.WriteLine ("Setarea numelui și priorității. \ N"); Thrd.Name = "Primar Stream";

Console.WriteLine ("Acum thread-ul principal este numit:" + Thrd.Name);







Console.WriteLine ("Acum prioritate:" + Thrd.Priority);

Mai jos este rezultatul acestui program.

Firul principal nu are nume. Prioritate: Normal

Setați numele și prioritatea.

Acum, firul principal se numește: Prioritate principală acum: AboveNormal

Cu toate acestea, ar trebui să fie foarte atent atunci când efectuați operațiuni cu fluxul principal. Deci, dacă adăugați următorul apel la metoda Join () la sfârșitul metodei Main ():

programul nu se va termina niciodată, pentru că va aștepta sfârșitul firului principal!

882 Partea II. C # bibliotecă

Unelte suplimentare cu filete multiple introduse în .NET Framework 4.0

În versiunea .NET Framework 4.0, sunt introduse un număr de noi instrumente multi-threading, care pot fi foarte utile. Cel mai important dintre acestea este un nou sistem de anulare. În acest sistem, mecanismul de anulare a fluxului este sprijinit într-un mod simplu, bine definit și structurat. Acest mecanism se bazează pe conceptul de anulare, care indică starea de anulare a fluxului. Simbolurile de anulare sunt acceptate în clasa CancellationTokenSource și în structura CancellationToken. Sistemul de anulare este complet integrat în noua bibliotecă de paralelizare a sarcinilor (TPL) și, prin urmare, este discutată mai detaliat împreună cu TPL din capitolul 24.

starea publică de bool Yield ()

Această metodă returnează o valoare booleană a valorii adevărate dacă apare comutatorul de context. În absența unui alt fir gata de execuție, comutatorul de context nu va apărea.

Recomandări pentru programarea cu mai multe șuruburi

Rulați o sarcină separată

Multitaskingul bazat pe fire este cel mai des organizat cu programarea C #. Dar, unde este cazul, se poate organiza multitasking bazat pe procese. În acest caz, în loc să rulați un alt fir în același program

Capitolul 23. Programarea cu mai multe fire. Partea I: Fundațiile 883

un program începe executarea unui alt program. La programarea în C #, aceasta se face folosind clasa Process definită în spațiul de nume System. Diagnostics. La sfârșitul acestui capitol, vom discuta pe scurt caracteristicile de pornire și gestionare a unui alt proces.

Cea mai ușoară cale de a începe un alt proces este să utilizați metoda Start (). definite în clasa Process. Mai jos este una dintre cele mai simple forme ale acestei metode:

proces static public de pornire (numele fișierului șir)

unde numele fișierului denumește un anumit nume de fișier care trebuie executat sau asociat cu fișierul executabil.

public void Închide ()

Procesul poate fi întrerupt în două moduri. Dacă procesul este o aplicație Windows cu o interfață grafică de utilizator, metoda CloseMainWindow () este chemată să întrerupă acest proces. a cărui formă este dată mai jos.

public bool CloseMainWindow ()

Această metodă trimite un mesaj procesului care îl instruiește să se oprească. Aceasta returnează un adevărat boolean dacă mesajul este primit și un mesaj boolean false dacă aplicația nu are o interfață grafică de utilizator sau o fereastră principală. Cu toate acestea, trebuie să rețineți că metoda CloseMainWindow () servește doar pentru a solicita oprirea procesului. Dacă aplicația ignoră o astfel de solicitare, aceasta nu va fi întreruptă ca proces.

Pentru a întrerupe necondiționat procesul, sunați la metoda Kill (). după cum se arată mai jos.

public void Kill ()

Dar metoda Kill () ar trebui să fie utilizată cu ușurință, deoarece duce la o întrerupere necontrolată a procesului. Orice date nesalvate asociate cu procesul întrerupt vor fi cel mai probabil pierdute.

Pentru a aranja așteptarea încetării procesului, puteți folosi metoda WaitForExit (). Mai jos sunt două forme.

public void WaitForExit ()

bool public WaitForExit (int milisecunde)

În prima formă, așteptarea este continuată până la finalizarea procesului,

iar în a doua formă - numai pentru numărul specificat de milisecunde. În acest din urmă caz, metoda WaitForExit () returnează o valoare booleană a adevăratului dacă procesul este finalizat, iar valoarea logică este falsă, dacă este încă în desfășurare.

884 Partea II. C # bibliotecă

// Demonstrați lansarea unui nou proces.

clasa StartProcess Procesați newProc = Process.Start ("wordpad.exe");

Console.WriteLine ("Noul proces se execută.");

newProc.Close (); // eliberați resursele alocate

Console.WriteLine ("Noul proces este finalizat.");

Când se execută acest program, pornește aplicația standard WordPad și apare mesajul "Proces nou a început". Apare pe ecran. Programul așteaptă apoi închiderea programului WordPad. Când programul WordPad se termină, mesajul "Noul proces este finalizat". Apare pe ecran. .







Trimiteți-le prietenilor: