В приведенном ниже примере программы создаются две задачи и показывается, какая из них исполняется.
// Продемонстрировать применение свойств Id и Currentld.
Using System;
Using System.Threading;
Using System.Threading.Tasks;
class DemoTask {
// Метод, исполняемый как задача, static void MyTaskO {
Console.WriteLine("MyTask() №" + Task.Currentld + " запущен");
for (int count = 0; count < 10; count++) {
Thread.Sleep(500);
Console.WriteLine("В методе MyTaskO #" + Task.Currentld +
", подсчет равен " + count);
}
Console.WriteLine("MyTask №" + Task.Currentld + " завершен");
}
static void Main() {
Console.WriteLine("Основной поток запущен.");
// Сконструировать объекты двух задач.
Task tsk = new Task(MyTask);
Task tsk2 = new Task(MyTask);
// Запустить задачи на исполнение, tsk.Start(); tsk2.Start();
Console.WriteLine("Идентификатор задачи tsk: " + tsk.Id);
Console.WriteLine("Идентификатор задачи tsk2: " + tsk2.Id);
// Сохранить метод Main() активным до завершения остальных задач, for(int i = 0; i < 60; i++) {
Console.Write(".");
Thread.Sleep (100);
}
Console.WriteLine("Основной поток завершен.");
}
}
Выполнение этой программы приводит к следующему результату.
Основной поток запущен Идентификатор задачи tsk: 1 Идентификатор задачи tsk2: 2.MyTask() №1 запущен MyTask() №2 запущен
MyTask №1 завершен
В методе MyTask() №2, подсчет равен 9 MyTask №2 завершен.........Основной поток завершен.
Применение методов ожидания
В приведенных выше примерах основной поток исполнения, а по существу, метод Main (), завершался потому, что такой результат гарантировали вызовы метода Thread. Sleep (). Но подобный подход нельзя считать удовлетворительным.
Организовать ожидание завершения задач можно и более совершенным способом, применяя методы ожидания, специально предоставляемые в классе Task. Самым простым из них считается метод Wait (), приостанавливающий исполнение вызывающего потока до тех пор, пока не завершится вызываемая задача. Ниже приведена простейшая форма объявления этого метода.
Public void Wait()
При выполнении этого метода могут быть сгенерированы два исключения. Первым из них является исключение Ob j ectDisposedException. Оно генерируется в том случае, если задача освобождена посредством вызова метода Dispose (). А второе исключение, AggregateException, генерируется в том случае, если задача сама генерирует исключение или же отменяется. Как правило, отслеживается и обрабатывается именно это исключение. В связи с тем что задача может сгенерировать не одно исключение, если, например, у нее имеются порожденные задачи, все подобные исключения собираются в единое исключение типа AggregateException. Для того чтобы выяснить, что же произошло на самом деле, достаточно проанализировать внутренние исключения, связанные с этим совокупным исключением. А до тех пор в приведенных далее примерах любые исключения, генерируемые задачами, будут обрабатываться во время выполнения.
Ниже приведен вариант предыдущей программы, измененный с целью продемонстрировать применение метода Wait () на практике. Этот метод используется внутри метода Main (), чтобы приостановить его выполнение до тех пор, пока не завершатся обе задачи tsk и tsk2.
// Применить метод Wait().
Using System;
Using System.Threading;
Using System.Threading.Tasks;
class DemoTask {
// Метод, исполняемый как задача, static void MyTask() {
Console.WriteLine("MyTask() №" + Task.Currentld + " запущен");
for(int count = 0; count < 10; count++) {
Thread.Sleep(500);
Console.WriteLine("В методе MyTask() #" + Task.Currentld +
", подсчет равен " + count);
}
Console.WriteLine("MyTask №" + Task.Currentld + " завершен");
}
static void Main() {
Console.WriteLine("Основной поток запущен.");
// Сконструировать объекты двух задач.
Task tsk = new Task(MyTask);
Task tsk2 = new Task(MyTask);
// Запустить задачи на исполнение, tsk.Start(); tsk2.Start();
Console.WriteLine("Идентификатор задачи tsk: " + tsk.Id); Console.WriteLine("Идентификатор задачи tsk2: " + tsk2.Id);
// Приостановить выполнение метода Main() до тех пор,
// пока не завершатся обе задачи tsk и tsk2 tsk.Wait (); tsk2.Wait ();
Console.WriteLine("Основной поток завершен.");
}
}