В некоторых случаях оказывается полезной другая форма метода Abort (), приведенная ниже в общем виде:
public void Abort(object
где
// Использовать форму метода Abort (object
using System;
using System.Threading;
class MyThread {
public Thread Thrd;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Это точка входа в поток, void Run() { try {
Console.WriteLine(Thrd.Name + " начат.");
for (int i = 1; i <= 1000; i++) {
Console.Write(i + " "); if((i%10)==0) {
Console.WriteLine();
Thread.Sleep(250);
}
}
Console.WriteLine(Thrd.Name + " завершен нормально.");
} catch(ThreadAbortException exc) {
Console.WriteLine("Поток прерван, код завершения " + exc.ExceptionState);
>
)
}
class UseAltAbort { static void Main() {
MyThread mtl = new MyThread("Мой Поток");
Thread.Sleep(1000) ; // разрешить порожденному потоку начать свое выполнение Console.WriteLine("Прерывание потока."); mtl.Thrd.Abort(100);
Console.WriteLine("Основной поток прерван.");
}
}
Эта программа дает следующий результат.
Прерывание потока.
Поток прерван, код завершения 100 Основной поток прерван.
Как следует из приведенного выше результата, значение 100 передается методуAbort() в качестве кода прерывания. Это значение становится затем доступным посредством свойстваExceptionStateиз класса исключенияThreadAbortException,которое перехватывается потоком при его прерывании.
Отмена действия метода Abort ()
Запрос на преждевременное прерывание может быть переопределен в самом потоке. Для этого необходимо сначала перехватить в потоке исключениеThreadAbortException,а затем вызвать методResetAbort (). Благодаря этому исключается повторное генерирование исключения по завершении обработчика исключения, прерывающего данный поток. Ниже приведена форма объявления методаResetAbort().
public static void ResetAbort()
Вызов методаResetAbort() может завершиться неудачно, если в потоке отсутствует надлежащий режим надежной отмены преждевременного прерывания потока.
В приведенном ниже примере программы демонстрируется применение методаResetAbort().
// Использовать метод ResetAbort().
using System;
using System.Threading;
class MyThread {
public Thread Thrd;