Остановка и возобновление работы потоков

Запущенный на выполнение поток может быть остановлен путем вызова метода 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().

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: