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

And*_*mar 5 c# multithreading async-await c#-5.0

我们有一个webservice函数,它在后台运行一系列任务.当所有任务完成后,它将返回.我重新考虑了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);
Run Code Online (Sandbox Code Playgroud)

task.Result做的单个任务等待.我已经通过向DoWork方法添加三秒延迟并在不到5秒的时间内验证它完成测试,以获得10个任务的列表.

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

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

Ree*_*sey 9

我会这样写:

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

var results = (await Task.WhenAll(tasks)).ToList();
Run Code Online (Sandbox Code Playgroud)

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

  • 你可以稍微简化一下:`var results = await Task.WhenAll(tasks);` (2认同)