Приключване на потоците в C #, блог за криптиране
Когато се обадите Thread.Abort поток в процес на разглеждане, в крайна сметка, става ThreadAbortException. Така че, естествено, за точното поддържането на тази ситуация е необходимо да се справи с ThreadAbortException изключение, ако нишката трябва да направи нещо специално в случай на прекъсване.
Има дори и претоварване на абортира, който взема произволно референтен обект капсулирани тогава ThreadAbortException. Това позволява код поток е прекъснат, за предаване на някакъв контекст информация манипулатор ThreadAbortException, например, да причини да го прекрати.
CLR не предоставя ThreadAbortException, ако потокът не се изпълнява в рамките на една управлявана контекст. Ако потокът се нарича "роден" функция на нивото на P / Invoke и тази функция отнема много време, за да завърши, прекъсването на потока се забавя, докато, докато управлението се връща на контролираното пространство.
В .NET 2.0 и по-късно, когато най-накрая блок на доставка на ThreadAbortException се забави толкова дълго, колкото изпълнението напуска най-накрая да го блокира. В .NET 1.x прекъсване изключение се доставя или иначе.
Повикване Прекратяване на потока не го счупи със сила, така че ако искате да се изчака до тогава, докато нишката завършва изпълнението наистина трябва да се обадя на присъединяване към тази тема да се изчака до тогава, до приключване на изключение манипулатор код ThreadAbortException.
През това чакане има смисъл да настроите времето за изчакване, за да не чакаме вечно, докато финал на потока почистване след себе си. Въпреки факта, че кодът в изключение манипулатор трябва да се съобразява с други правила за кодиране на процесори, има възможност, че процесорът ще трябва много време, а дори и безкрайно много, за да завърши работата.
Нека да видим как ThreadAbortException манипулатор:
След един бърз поглед към кода може да изглежда като предизвикателство за присъединяване newinstance копие ще блокира завинаги. Все пак, това не се случи. Тя ще изглежда като ThreadAbortException обработват вътре функцията линия поток, по изключение ще бъде "погълнат" и цикълът ще продължи, без значение колко пъти основната нишка ще се опита да прекъсне потока.
Въпреки ThreadAbortException изключение, генерирани чрез метод Thread.Abort се държи по специален начин.
Когато нишката завършва изключение обработка, по време на работа имплицитно генерира отново в края на водача си. Това е като като че ли отново се генерира изключение. По този начин, всички външни манипулатори или блокира най-накрая да се извършват нормално. В примера на присъединяване повикване няма да чакаме вечно, както можеше да се предположи.
Re поколение ThreadAbortException изключения система може да се предотврати, като се обадите на статичен метод Thread.ResetAbort. Въпреки това, общата препоръка представлява предизвикателство ResetAbort само от нишката, която спря откажем. Ако искате това да се случи в рамките на ThreadAbortException изключение манипулатор спира притока, ще трябва да се прилагат сложни техники в групата за взаимодействие.
Ако сте стигнали до извода, че е необходимо да се въведе такава прекъсване на техника за отказ в един поток, а след това най-вероятно означава, че сте на първо място, е необходимо да се преразгледа проекта на техните системи. С други думи, това е признак на лош дизайн!
Въпреки издръжливостта й осигурява много по-ясна механизъм, който да пречи на движението, като например да се информират заинтересованите страни за това, прекъсването на потока, все още ThreadAbortException манипулатор трябва да се прилагат правилно.
Фактът, че ThreadAbortException случаи могат да бъдат генерирани асинхронно в произволен контрол на потока възпрепятства създаването на устойчива, безопасна за кода за изключение.