Приоритеты потоков
Каждый поток имеет определенный приоритет. Потоки с более высоким приоритетом имеют преимущество перед другими потоками и могут полностью блокировать работу потоков с более низкими приоритетами. Приоритет потока можно прочитать или изменить с помощью свойства Priority, которое является членом класса Thread.
Общий формат его использования таков:
public ThreadPriority Priority{ get; set; }
Здесь ThreadPriority — перечисление, которое определяет следующие пять зна-
чений приоритета:
ThreadPriority.Highest высокий
ThreadPriority.AboveNormal выше нормального
ThreadPriority.Normal нормальный
ThreadPriority.BelowNormial ниже нормального
ThreadPriority.Lowest низкий
Каждый процесс (не поток!) имеет некоторый приоритет. Приоритет процесса, запустившего потоки считается базовым для потоков и принимается за нормальный. Например, установка разных приоритетов для потоков thr1 и thr2 будет выглядеть следующим образом:
thr1.Priority = ThreadPriority.AboveNormal;
thr2.Priority = ThreadPriority.BelowNormal;
Запущенный на выполнение поток может быть остановлен путем вызова метода Suspend(), а возобновление выполнения – путем вызова метода Resume():
thr1.Suspend(); // останов потока
thr1.Resume(); // восстановление работы потока
Для аварийного завершения работы потока служит метод Abort(). Этот метод имеет два формата:
public void Abort()
public void Abort(object info)
Метод Abort ()завершает работу потока и генерирует исключение типа ThreadAbortException для потока.
Исключение может быть перехвачено программным кодом. С помощью параметра info в программный блок catch, обрабатывающий данное исключение, может быть передана информация о причине завершения потока.
Пример демонстрирующий использование метода Abort ():
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace ThreadAbort
{
// Класс для установки и чтения текущей температуры
class Grd
{
int grade =0;// температура в градусах
// установка и чтение текущей температуры
public int Grade
{
get
{
return grade;
}
set
{
grade = value;
}
}
}
class MyThread
{
Grd gr; // Ссылка на объект "разогрева"
public Thread th; // Поток для "разогрева" объекта
public MyThread(Grd grd)
{
gr = grd;// Получаем ссылку на объект "разогрева"
th = new Thread(new ThreadStart(FnThr));
th.Start();
}
// Функция которая греет объект
void FnThr()
{ //здесь мы греем и можем "перегреться"
try //блок,где может быть вызвано исключение
{
for (int j = 0; j < 10; j++)
{
Console.WriteLine("Температура={0}", gr.Grade);
lock(gr) gr.Grade += 10;
Thread.Sleep(100); // Передаем управление другому потоку
}
}
// Перехватываем исключение и печатаем причину
catch (ThreadAbortException abortException)
{
Console.WriteLine((string)abortException.ExceptionState);
}
}
}
class Program
{
static void Main(string[] args)
{
Grd gr = new Grd(); //Создаем объект для разогрева
MyThread thr = new MyThread(gr);//Запускаем процесс обогрева - поток
int grd;
lock(gr) grd = gr.Grade;
// Следим за процессом нагрева
while (grd <= 70)
lock (gr) grd = gr.Grade;
thr.th.Abort("Перегрелись");// хватит греть
}
}
}
Результат работы программы:
Температура=0
Температура=10
Температура=20
Температура=30
Температура=40
Температура=50
Температура=60
Температура=70