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