Поиск

Уничтожение потоков

Уничтожить поток можно вызовом метода Thread.Abort. Исполняющая среда насильно завершает выполнение потока, генерируя исключение ThreadAbortException. Даже если метод попытается уловить ThreadAbort-Exception, исполняющая среда этого не допустит. Однако она исполнит код из блока finally потока, выполнение которого прервано, если этот блок присутствует. Это проиллюстрировано следующим кодом. Выполнение метода Main приостанавливается на 2 секунды, чтобы дать исполняющей среде время для запуска рабочего потока. После запуска рабочий поток считает до десяти, останавливаясь после каждого отсчета на секунду. Когда выполнение метода Main возобновляется после двухсе-кундной паузы, он прерывает выполнение рабочего потока. После этого исполняется блок finally.

using System;
using System.Threading;
class ThreadAbortApp {
public static void WorkerThreadMethodO {
try {
Console.WrlteLine("Worker thread started");
Console.WriteLine
("Worker thread - counting slowly to 10"); for (int i = 0; i < 10; i++) {
Thread. SleepdOOO};
Console.Writer{0}...", i); }
Console.WriteLinef'Worker thread finished"); }
catch(ThreadAbortException e)
{
}
finally
<
Console.WriteLine ("Worker thread -
I can't catch the exception, but I can cleanup"); } }
public static void Main() <
ThreadStart worker = new ThreadStart(WorkerThreadMethod);
Console.WriteLine("Main - Creating worker thread");
Thread t = new Thread(worker); t.StartQ;
// Даем время для запуска рабочего потока.
Console.WriteLine("Main - Sleeping for 2 seconds"); Thread.Sleep(2000);
Console.WriteLine("\nMain - Aborting worker thread"); t.AbortO; } }
Скомпилировав и запустив это приложение, вы получите такой результат:
Main - Creating worker thread
Main - Sleeping for 2 seconds
Worker thread started
Worker thread - counting slowly to 10
0...1...2...3...
Main - Aborting worker thread
Worker thread - I can't catch the exception, but I can cleanup

Вы должны отдавать себе отчет в том, что при вызове метода Thread.Abort выполнение потока не может остановиться сразу. Исполняющая среда ожидает, пока поток не достигнет той точки, которая в документации названа "безопасной точкой" ("safe point"). Поэтому, если ваша программа зависит от некоторых действий, которые происходят после прерывания потока, и вам надо быть уверенными в том, что поток остановлен, вы можете использовать метод Thread. Join. Это синхронный вызов, т. е. он не вернет управление, пока поток не будет остановлен. Напоследок обратите внимание, что после прерывания поток нельзя перезапустить. В этом случае, несмотря на то, что у вас есть действительный объект Thread, от него нет никакой пользы в плане выполнения кода.