}
Ниже приведен результата выполнения данной программы.
Основной поток запущен.
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 предоставляются и
Возврат значения из задачи
Задача может возвращать значение. Это очень удобно по двум причинам. Во-первых, это означает, что с помощью задачи можно вычислить некоторый результат. Подобным образом поддерживаются параллельные вычисления. И во-вторых, вызывающий процесс окажется блокированным до тех пор, пока не будет получен результат. Это означает, что для организации ожидания результата не требуется никакой особой синхронизации.
public Task(Func<TResult>
public Task(FuncCObject, TResult>
где
Как и следовало ожидать, имеются также другие варианты метода StartNew (), доступные в обобщенной форме класса TaskFactory<TResult> и поддерживающие возврат результата из задачи. Ниже приведены те варианты данного метода, которые применяются параллельно с только что рассмотренными конструкторами класса Task.
public Task<TResult> StartNew(Func<TResult>
public Task<TResult> StartNew(Func<Object,TResult>
В любом случае значение, возвращаемое задачей, получается из свойства
