如何将两个任务集合链接在一起?

时间:2018-03-15 20:21:36

标签: c# multithreading azure task-parallel-library azure-functions

我试图运行一系列任务,然后一旦完成,就运行一个单独的任务集合。实质上,第一个任务集合负责写入某些数据库表,最终的任务集合将这些表中的数据整理到报告表中。

我使用的代码示例如下:

var dbWriteTasks = clients.Select(c => DoSomeWorkAsync(c)).ToArray();
var dbCollateTasks = clients.Select(c => DoSomeOtherWorkAsync(c));

Task.Factory.ContinueWhenAll(dbWriteTasks, t => dbCollateTasks.ToArray());

这是成功运行第一组任务,但是没有运行任何第二组任务,所以我显然做错了。

我也试过这个无济于事:

var dbWriteTasks = clients.Select(c => DoSomeWorkAsync(c)).ToArray();
var dbCollateTasks = clients.Select(c => DoSomeOtherWorkAsync(c)).ToArray();

Task.Factory.ContinueWhenAll(dbWriteTasks, t => dbCollateTasks);

这会运行两组任务,但第二组在第一组任务完成插入之前开始运行并处理数据...

我还应该提一下,我已经尝试使用Task.WaitAll同步运行这两组任务,但这也没有奏效。我尝试在Azure函数中执行所有这些操作,Task.WaitAll只是让它停止。

我对TPL比较陌生,所以任何建议都会非常感激!

1 个答案:

答案 0 :(得分:5)

使用await Task.WhenAll代替工厂方法。使用await可以无缝地创建读取类似同步代码的延续。

var dbWriteTasks = clients.Select(c => DoSomeWorkAsync(c))
var dbCollateTasks = clients.Select(c => DoSomeOtherWorkAsync(c));

await Task.WhenAll(dbWriteTasks);
await Task.WhenAll(dbCollateTasks);