Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Одновременное пребывание потока в различных состояниях

В условиях многопоточного приложения разные потоки могут переводить друг друга в разные состояния. Таким образом, поток может находиться одновременно в БОЛЕЕ ЧЕМ ОДНОМ Состоянии.

Например, если поток блокирован в результате вызова метода Wait, а другой поток вызвал по отношению к блокированному потоку метод Abort, то блокированный поток окажется в одно и то же время в состояниях WaitSleepJoin и AbortRequested.

В этом случае, как только поток выйдет из состояния WaitSleepJoin (в котором он оказался в результате выполнения метода Wait), ему будет предъявлено исключение ThreadAbortException, связанное с началом процедуры aborting.

С другой стороны, не все сочетания значений ThreadState допустимы. Например, поток не может одновременно находиться в состояниях Aborted и Unstarted. Перевод потока из одного состояния в другое несовместимое с ним состояние, а также повторная попытка перевода потока в одно и то же состояние (пара потоков один за другим применяют метод Resume() к одному и тому же потоку), может привести к генерации исключения. Поэтому операторы, связанные с управлением потоками следует размещать в блоках try.

Информация о возможности одновременного пребывания потока в нескольких состояниях представлена таблице допустимых состояний:

AR

Ab

Back

U

S

R

W

St

SusR

StopR

AbortRequested

--

N

Y

Y

Y

N

Y

N

Y

N

Aborted

N

--

Y

N

N

N

N

N

N

N

Background

Y

Y

--

Y

Y

N

Y

Y

Y

N

Unstarted

Y

N

Y

--

N

N

N

N

N

N

Suspended

Y

N

Y

N

--

N

Y

N

N

N

Running

N

N

N

N

N

--

N

N

N

N

WaitSleepJoin

Y

N

Y

N

Y

N

--

N

Y

N

Stopped

N

N

Y

N

N

N

N

--

Y

N

SuspendRequested

Y

N

Y

N

N

N

Y

N

--

N

StopRequested

N

N

N

N

N

N

N

N

N

--

Фоновый поток

Потоки выполняются:

  • в обычном режиме (Foreground threads) и

  • в фоновом режиме (Background threads).

Состояние Background state распознаётся по значению свойства IsBackground, которое указывает на режим выполнения потока: background или foreground.

Любой Foreground поток можно перевести в фоновый режим, установив значение свойства IsBackground в true.

Завершение Background потока не влияет на завершение приложения в целом.

Завершение последнего Foreground потока приводит к завершению приложения, независимо от состояния потоков, выполняемых в фоновом режиме.

Ниже в примере один из потоков переводится в фоновый режим. Изменяя значения переменных, определяющих характеристики циклов, можно проследить за поведением потоков.

using System;

using System.Threading;

namespace ThreadApp_1

{

class Worker

{

int allTimes;

public Worker(int tKey)

{

allTimes = tKey;

}

// Тело рабочей функции...

public void DoItEasy()

{//====================================

int i;

for (i = 0; i < allTimes; i++)

{

Console.WriteLine(“Back thread >>>> {0}\r”,i);

}

Console.WriteLine(“\nBackground thread was here!”);

}//====================================

}

class StartClass

{

static void Main(string[] args)

{

long i;

Worker w0 = new Worker(100000);

ThreadStart t0;

t0 = new ThreadStart(w0.DoItEasy);

Thread th0;

th0 = new Thread(t0);

th0.IsBackground = true;

th0.Start();

for (i = 0; i < 100 ; i++)

{

Console.WriteLine(“Fore thread: {0}”, i);

}

Console.WriteLine(“Foreground thread ended”);

}

}

}