где
// Использовать форму метода 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;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start;
}
// Это точка входа в поток, void Run {
Console.WriteLine(Thrd.Name + ".начат.");
try {