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

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);


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



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