§ Первый вариант остановки потока тривиален. Поток завершается после выполнения ПОСЛЕДНЕГО оператора выполняемой цепочки операторов. Допустим, в ходе выполнения условного оператора значение некоторой переменной сравнивается с фиксированным значением и в случае совпадения значений управление передаётся оператору return:
for (x=0;;x++)
{
if (x==max)
return; // Всё. Этот оператор оказался последним.
else
{
::::::::::
}
}
§ Поток может быть остановлен в результате выполнения метода Abort(). Эта остановка является достаточно сложным делом.
1. При выполнении этого метода происходит активация исключения ThreadAbortException. Естественно, это исключение может быть перехвачено в соответствующем блоке catch. Во время обработки исключения допустимо выполнение самых разных действий, которые осуществляются в этом самом “остановленном” потоке. В том числе, возможна и реанимация остановленного потока путём вызова метода ResetAbort().
2. При перехвате исключения CLR обеспечивает выполнение операторов блоков finally, которые выполняются всё в том же потоке.
Таким образом, остановка потока путём вызова метода Abort не может рассматриваться как НЕМЕДЛЕННАЯ остановка выполнения потока.