使用 async/await 重写多线程等待



我们有一个在后台运行任务列表的网络服务函数。 当所有任务完成后,它将返回。 我重新审视了 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重写上述代码片段的任何想法?

我会把它写成:

var tasks = rowlist.Select(row => Task.Run(() => DoWork(row)));
var results = (await Task.WhenAll(tasks)).ToList();

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

根据Reed Copsey,Servy和Stephen Cleary的回答和评论,我已经发展到这个解决方案:

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

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

最新更新