5

我们有一个在后台运行任务列表的网络服务功能。完成所有任务后,它会返回。我重新审视了 C# 5 的函数。我设法使以下代码段正常工作:

var result = new List<int>();
var tasks = new List<Task<int>>();

foreach (var row in rowlist)
    tasks.Add(Task.Factory.StartNew(() => DoWork(row)));
foreach (var task in tasks)
    result.Add(task.Result);

task.Result等待单个任务完成。我已经通过向该DoWork方法添加 3 秒延迟并验证它是否在 5 秒内完成,对 10 个任务的列表进行了测试。

现在我尝试使用新async / await语法重写函数。但我似乎无法让它工作。如果它编译,它会同步运行,通过添加等待来验证。

关于如何使用重写上述代码段的任何想法async / await

4

2 回答 2

9

我会这样写:

var tasks = rowlist.Select(row => Task.Run(() => DoWork(row)));

var results = (await Task.WhenAll(tasks)).ToList();

基本上,您仍然按照以前的方式创建任务(不使用await),因为您希望它们立即开始。然后,您可以等待它们全部异步完成(通过await Task.WhenAll),然后立即提取结果(因为您知道它们都已完成)。

于 2012-10-03T18:41:51.740 回答
2

根据 Reed Copsey、Servy 和 Stephen Cleary 的回答和评论,我已经改进了这个解决方案:

var results = rowlist
    .Select(row => Task.Run(() => DoWork(row)))
    .ToList()
    .Select(t => t.Result);

第二个Select将等待任务完成。我ToList()在两者之间添加了一个以防止流式传输,但没有它似乎可以工作。

于 2012-10-03T19:30:04.933 回答