Console.Write(i + " "); if((i %10)==0) {
Console.WriteLine ;
Thread.Sleep (250);
}
} catch(ThreadAbortException exc) { if((int)exc.ExceptionState ==0) {
Console.WriteLine("Прерывание потока отменено! " +
"Код завершения " + exc.ExceptionState);
Thread.ResetAbort;
}
else
Console.WriteLine("Поток прерван, код завершения " + exc.ExceptionState);
' }
}
Console.WriteLine(Thrd.Name + " завершен нормально.");
}
}
class ResetAbort { static void Main {
MyThread mtl = new MyThread("Мой Поток");
Thread.Sleep(1000); // разрешить порожденному потоку начать свое выполнение
Console.WriteLine("Прерывание потока."); mtl.Thrd.Abort(0); // это не остановит поток
Thread.Sleep(1000); // разрешить порожденному потоку выполняться подольше
Console.WriteLine("Прерывание потока."); i
mtl.Thrd.Abort(100); // а это остановит поток
mtl.Thrd.Join; // ожидать прерывания потока
Console.WriteLine("Основной поток прерван.");
}
}
Ниже приведен результат выполнения этой программы.
Поток прерван, код завершения 100
Основной поток прерван.
Если в
данном примере программы методAbort вызывается с нулевым аргументом, то запрос на преждевременное прерывание отменяется потоком, вызывающим методResetAbort , и выполнение этого потока продолжается. Любое другое значение аргумента приведет к прерыванию потока.Приостановка и возобновление потока
В первоначальных версиях среды .NET Framework поток можно было приостановить вызовом метода
Thread. Suspend и возобновить вызовом методаThread. Resume . Но теперь оба эти метода считаются устаревшими и не рекомендуются к применению в новом коде. Объясняется это, в частности, тем, что пользоваться методомSuspend на самом деле небезопасно, так как с его помощью можно приостановить поток, который в настоящий момент удерживает блокировку, что препятствует ее снятию, а следовательно, приводит к взаимоблокировке. Применение обоих методов может стать причиной серьезных осложнений на уровне системы. Поэтому для приостановки и возобновления потока следует использовать другие средства синхронизации, в том числе мьютекс и семафор.Определение состояния потока
Состояние потока может быть получено из свойства
Threadstate,доступного в классеThread.Ниже приведена общая форма этого свойства.public ThreadState ThreadState{ get; }
Состояние потока возвращается в виде значения, определенного в перечислении
ThreadState.Ниже приведены значения, определенные в этом перечислении.ThreadState.Aborted
ThreadState.AbortRequested
ThreadState.Background
ThreadState.Running
ThreadState.Stopped
ThreadState.StopRequested
ThreadState.Suspended