【发布时间】:2015-12-19 21:42:08
【问题描述】:
好的,所以基本上我有一堆任务 (10),我想同时启动它们并等待它们完成。完成后,我想执行其他任务。我阅读了很多关于此的资源,但我无法针对我的特定情况进行正确的处理...
这是我目前拥有的(代码已被简化):
public async Task RunTasks()
{
var tasks = new List<Task>
{
new Task(async () => await DoWork()),
//and so on with the other 9 similar tasks
}
Parallel.ForEach(tasks, task =>
{
task.Start();
});
Task.WhenAll(tasks).ContinueWith(done =>
{
//Run the other tasks
});
}
//This function perform some I/O operations
public async Task DoWork()
{
var results = await GetDataFromDatabaseAsync();
foreach (var result in results)
{
await ReadFromNetwork(result.Url);
}
}
所以我的问题是,当我通过WhenAll 调用等待任务完成时,它告诉我所有任务都已结束,即使它们都没有完成。我尝试在我的foreach 中添加Console.WriteLine,当我进入延续任务时,数据不断从我之前的Tasks 中传入,但尚未真正完成。
我在这里做错了什么?
【问题讨论】:
-
我怀疑你在某处有一个
Task<Task>(直接调用Task构造函数有点可疑),你真的想等待内部任务。您可以使用Task.Run代替Task 构造函数/Start 吗?Task.Run将为您解包。 -
所以你认为我应该这样做: var tasks = new List
{ Task.Run(()=> DoWork()) }
标签: c# .net asynchronous async-await task-parallel-library