Console.WriteLine("Продолжение завершено");
}
static void Main() {
Console.WriteLine("Основной поток запущен.");
// Сконструировать объект первой задачи.
Task tsk = new Task(MyTask);
//А теперь создать продолжение задачи.
Task taskCont = tsk.ContinueWith(ContTask);
// Начать последовательность задач, tsk.Start () ;
// Ожидать завершения продолжения. taskCont.Wait();
tsk.Dispose(); taskCont.Dispose();
Console.WriteLine("Основной поток завершен.");
}
}
Ниже приведен результата выполнения данной программы.
Основной поток запущен.
MyTas к() запущен
В методе MyTaskO подсчет равен 0
MyTask() завершен Продолжение запущено В продолжении подсчет равен О В продолжении подсчет равен 1 В продолжении подсчет равен 2 В продолжении подсчет равен 3 В продолжении подсчет равен 4 Продолжение завершено Основной поток завершен.
Как следует из приведенного выше результата, вторая задача не начинается до тех пор, пока не завершится первая. Обратите также внимание на то, что в методеMain() пришлось ожидать окончания только продолжения задачи. Дело в том, что методMyTask() как задача завершается еще до начала методаContTaskкак продолжения задачи. Следовательно, ожидать завершения методаMyTask() нет никакой надобности, хотя если и организовать такое ожидание, то в этом будет ничего плохого.
Любопытно, что в качестве продолжения задачи нередко применяется лямбда-выражение. Для примера ниже приведен еще один способ организации продолжения задачи из предыдущего примера программы.
//В данном случае в качестве продолжения задачи применяется лямбда-выражение. Task taskCont = tsk.ContinueWith((first) =>
{
Console.WriteLine("Продолжение запущено"); for(int count = 0; count < 5; count++) {
Thread.Sleep (500);
Console.WriteLine("В продолжении подсчет равен " + count );
}
Console.WriteLine("Продолжение завершено");
}
);
В этом фрагменте кода параметр first принимает предыдущую задачу (в данном случае — tsk).
Помимо методаContinueWith(), в классеTaskпредоставляются и
Возврат значения из задачи