Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прога - ответы2.docx
Скачиваний:
19
Добавлен:
23.04.2019
Размер:
206.38 Кб
Скачать

Основные члены класс Thread

CurrentThread

Ссылка на текущий выполняемый поток

GetDomain()

Ссылка на AppDomain текущего потока

GetDomainlD()

Идентификатор домена приложения текущего потока

Sleep()

Приостанавливает текущий поток на заданное время

IsAlive

Запущен ли поток (и еще не прерван и не отменен)

IsBackground

Является ли данный поток "фоновым"

Name

Позволяет установить дружественное текстовое имя потока, например для отладки

Priority

Приоритет потока (из перечисления ThreadPriority)

ThreadState

Состояние данного потока (из перечисления ThreadState )

Abort()

Инструктирует CLR прервать поток, как только это будет возможно

Interrupt ()

Прерывает (т.е. приостанавливает) текущий поток на заданный период ожидания

Join()

Блокирует вызывающий поток до тех пор, пока указанный поток не завершится

Resume()

Возобновляет ранее приостановленный поток

Start()

Инструктирует CLR запустить поток как можно скорее

Suspend()

Приостанавливает поток. Если поток уже приостановлен, ничего не делает

Состояния потока

Running

Поток выполняется, не заблокирован и исключение ThreadAbortException не было сгенерировано.

StopRequested

Поступил запрос на остановку потока. Используется внутренне средой CLR

SuspendRequested

Поступил запрос на усыпление потока.

Background

Поток является фоновым. Это состояние контролируется свойством Thread.IsBackground

Unstarted

Поток еще не запущен (для потока еще не был вызван метод Thread.Start())

Stopped

Поток остановлен

WaitSleepJoin

Поток заблокирован. Возможные причины:

  • в результате вызовов Thread.Sleep() /Thread.Join()

  • в результате блокировки вызовами Monitor.Enter()/Monitor.Wait() (либо использования блокировки при помощи lock)

  • ожидание освобождения синхрообъекта (например, ManualResetEvent)

Suspended

Поток усыплен

AbortRequested

Для потока был вызван метод Thread.Abort(), который порождает в потоке исключение System.Threading.ThreadAbortException, но исключение еще не было получено потоком

Aborted

Исключение ThreadAbortException получено потоком, и он уже завершен, однако его состояние еще не изменилось на Stopped

Многопоточное программирование при помощи асинхронных вызовов делегатов

Для выполнения некоторого метода в параллельном потоке можно создать делегат, соответствующий данному методу:

// Объявляем тип делегата

delegate int ControlThreadOp(String InFile, String OutFile);

// Метод, который будет выполняться в отдельном потоке

private int ControlThread(String InFile, String OutFile)

{

// do something

return result;

}

Затем при помощи метода BeginInvoke () запустить его в отдельном потоке

// Создаем делегат

ControlThreadOp controlThread = new ControlThreadOp(ControlThread);

// Запускаем делегат асинхронно в параллельном потоке

IAsyncResult ar = controlThread.BeginInvoke(inFile, outFile, null, null);

Два последних параметра метода BeginInvoke позволяют установить делегат типа AsyncCallback, который будет выполнен при завершении работы нового потока, и передать в вызываемый поток произвольный параметр типа System.Object.

Если есть необходимость дождаться завершения выполнения потока, выполняющего делегат, можно использовать предоставляемый для этого синхронизационный объект:

// ждем завершения работы параллельного потока

ar.AsyncWaitHandle.WaitOne();

Получить результат выполненного метода можно при помощи вызова EndInvoke(). Если при этом вызове поток делегата еще не завершился, текущий поток будет заблокирован до конца его работы.

int result = controlThread.EndInvoke(ar);