Finalizarea fluxurilor în C #, un blog despre criptare

Când apelați fluxul de Thread.Abort luate în considerare, în cele din urmă, devine ThreadAbortException. Deci, în mod natural, pentru menținerea corectă a acestei situații, este necesar să se ocupe de o excepție ThreadAbortException, în cazul în care un fir are de a face ceva special în cazul unei întreruperi.

Există chiar și o supraîncărcare a avorteze, care are un obiect de referință arbitrar încapsulate apoi ThreadAbortException. Acest lucru permite fluxul de cod este întreruptă, pentru a transmite anumite informații context manipulant ThreadAbortException, de exemplu, cauza Abandonați de apel.

CRJ nu livrează ThreadAbortException, în cazul în care debitul nu este executat într-un context gestionat. Dacă fluxul se numește funcția „nativă“ la nivelul P / Invoke, iar această funcție durează o lungă perioadă de timp pentru a finaliza, întreruperea fluxului de este amânată până la până la controlul revine la spațiul controlat.

În .NET 2.0 și mai târziu, în cazul în care în cele din urmă blocul de o livrare ThreadAbortException este întârziată, atâta timp cât executarea părăsește în cele din urmă să blocheze. În .NET 1.x excepție de întrerupere este livrat oricum.

Apelarea Abandonați pe fluxul nu-l rupe cu forța, așa că, dacă doriți să așteptați până atunci, până când firul de execuție se încheie într-adevăr nevoie pentru a apela Alăturați-vă la acest thread să aștepte până atunci, până la finalizarea excepție cod handler ThreadAbortException.

În timpul acestei așteptare are sens pentru a seta timeout-ul să nu aștepte pentru totdeauna, până la finisajul de curgere de curățare după ei. În ciuda faptului că acest cod într-un handler excepție trebuie să respecte alte reguli de procesoare de codificare, există posibilitatea ca procesorul va avea nevoie de o mulțime de timp, chiar și infinit de multe, pentru a finaliza lucrările.

Să vedem cum de tratare a ThreadAbortException:

După o privire rapidă la codul poate părea ca o provocare să se alăture copie newinstance va bloca pentru totdeauna. Cu toate acestea, acest lucru nu se întâmplă. S-ar părea ca ThreadAbortException manipulate în interiorul funcției de curgere în buclă, o excepție va fi „inghitit“, iar ciclul va continua, indiferent de cât de multe ori firul principal va încerca să-și întrerupă fluxul.

Cu toate acestea ThreadAbortException excepție generate prin metoda Thread.Abort se comportă într-un mod special.

În cazul în care firul se termină excepția de procesare, runtime generează implicit din nou la sfârșitul handler său. E ca si cum ai sunt re-generate excepția. Astfel, orice manipulare externe sau blocuri în cele din urmă să fie efectuate în mod normal. În exemplu, apelul nu va aștepta Alăturați-vă pentru totdeauna, așa cum s-ar putea asuma.

Re-generație sistem de excepții ThreadAbortException pot fi prevenite prin apelarea metodei Thread.ResetAbort statice. Cu toate acestea, recomandarea generală prevede o provocare ResetAbort numai din firul care sa oprit Abandonare. Dacă doriți ca acest lucru să se întâmple într-un ThreadAbortException excepție de tratare a întrerupe fluxul, va trebui să se aplice tehnici sofisticate de interacțiune în bandă.

Dacă ați ajuns la concluzia despre necesitatea de a pune în aplicare o astfel de întrerupere de anulare tehnică în fluxul, atunci cel mai probabil indică faptul că, în primul rând, este necesar să se revizuiască proiectarea sistemelor lor. Cu alte cuvinte, acesta este un semn de design de rău!

Deși runtime oferă un mecanism mult mai clar pentru a întrerupe fluxul, cum ar fi de a informa părțile interesate cu privire la faptul de a întrerupe fluxul, încă ThreadAbortException handler trebuie să fie puse în aplicare în mod corect.

Faptul că instanțele ThreadAbortException pot fi generate asincronă într-un flux de control arbitrar împiedică crearea durabilă, în condiții de siguranță la codul de excepție.