У меня есть последовательность задач, каждая из которых зависит от вывода предыдущей. Я хотел бы представить это как единственный объект Task
, результатом которого является вывод конца последовательности. (Если задачи не зависели друг от друга, я мог бы сделать это параллельно, и я использовал бы TaskFactory.ContinueWhenAll
.)
Я хотел бы реализовать этот метод:
static Task<TState> AggregateAsync<T, TState>(
IEnumerable<T> items,
TState initial,
Func<TState, T, Task<TState>> makeTask);
Как я могу эффективно выполнять задачи один за другим в последовательности? Я использую С# 4.0, поэтому я не могу использовать async
/await
, чтобы сделать это для меня.
Изменить: Я мог бы написать AggregateAsync
следующим образом:
static Task<TState> AggregateAsync<T, TState>(IEnumerable<T> items, TState initial, Func<TState, T, Task<TState>> makeTask)
{
var initialTask = Task.Factory.StartNew(() => initial);
return items.Aggregate(
initialTask,
(prevTask, item) =>
{
prevTask.Wait(); // synchronous blocking here?
return makeTask(prevTask.Result, item);
});
}
Но, конечно же, я получу пакет задач, каждый из которых блокирует синхронное ожидание одного перед ним?