C# 4.0 полное руководство - 2011
Шрифт:
' }
}
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
ThreadState.SuspendRequested
ThreadState.Unstarted
ThreadState.WaitSleepJoin
Все
Применение основного потока
Как пояснялось в самом начале этой главы, у всякой программы на C# имеется хотя бы один поток исполнения, называемый основным. Этот поток программа получает автоматически, как только начинает выполняться. С основным потоком можно обращаться таким же образом, как и со всеми остальными потоками.
Для доступа к основному потоку необходимо получить объект типа Thread, который ссылается на него. Это делается с помощью свойства CurrentThread, являющегося членом класса Thread. Ниже приведена общая форма этого свойства.
Данное свойство возвращает ссылку на тот поток, в котором оно используется. Поэтому если свойство CurrentThread используется при выполнении кода в основном потоке, то с его помощью можно получить ссылку на основной поток. Имея в своем распоряжении такую ссылку, можно управлять основным потоком так же, как и любым другим потоком.
В приведенном ниже примере программы сначала получается ссылка на основной поток, а затем получаются и устанавливаются имя и приоритет основного потока.
// Продемонстрировать управление основным потоком.
using System;
using System.Threading;
class UseMain {
static void Main {
Thread Thrd;
// Получить основной поток.
Thrd = Thread.CurrentThread;
// Отобразить имя основного потока, if(Thrd.Name == null)
Console.WriteLine("У основного потока нет имени."); else
Console.WriteLine("Основной поток называется: " + Thrd.Name);
// Отобразить приоритет основного потока.
Console.WriteLine("Приоритет: " + Thrd.Priority);
Console.WriteLine;
// Установить имя и приоритет.