【发布时间】:2013-12-06 10:50:14
【问题描述】:
我有一系列任务,其中每个任务都取决于前一个任务的输出。我想将其表示为单个 Task 对象,其结果是序列末尾的输出。 (如果任务不相互依赖,那么我可以并行执行,我会使用TaskFactory.ContinueWhenAll。)
我希望能够实现这个方法:
static Task<TState> AggregateAsync<T, TState>(
IEnumerable<T> items,
TState initial,
Func<TState, T, Task<TState>> makeTask);
如何高效地依次执行任务?我使用的是 C# 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);
});
}
但我肯定会得到一批任务,每个任务块同步等待它之前的一个?
【问题讨论】:
-
Microsoft.Bcl.Async nugget 在 .Net 4.0 项目中增加了对
async/await的支持,如果您愿意的话。 -
ContinueWith方法有帮助吗? msdn.microsoft.com/en-us/library/…
标签: c# .net c#-4.0 asynchronous