Запущенный на выполнение поток может быть остановлен путем вызова метода Suspend(), а возобновление выполнения – путем вызова метода Resume():
thr1.Suspend(); // останов потока
thr1.Resume(); // восстановление работы потока
Для аварийного завершения работы потока служит метод Abort(). Этот метод имеет два формата:
public void Abort()
public void Abort(object info)
Метод Abort ()завершает работу потока и генерирует исключение типа ThreadAbortException для потока.
Исключение может быть перехвачено программным кодом. С помощью параметра info в программный блок catch, обрабатывающий данное исключение, может быть передана информация о причине завершения потока.
Пример 2:
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("Перегрелись");// хватит греть
}
}
}
В программе, для синхронизации работы потоков использован метод lock().