ctl*_*eat 32 .net c# task-parallel-library async-await
我正在尝试做这样的事情:
foreach (var o in ObjectList)
{
CalculateIfNeedToMakeTaskForO(o);
if (yes)
TaskList.Add(OTaskAsync());
}
Run Code Online (Sandbox Code Playgroud)
现在我想等待所有这些任务完成.除了做
foreach(var o in ObjectList)
{
Result.Add("result for O is: "+await OTaskAsync());
}
Run Code Online (Sandbox Code Playgroud)
有什么我能做的吗?(更好,更优雅,更"正确")
Ste*_*ary 94
您正在寻找Task.WhenAll
:
var tasks = ObjectList
.Where(o => CalculateIfNeedToMakeTaskForO(o))
.Select(o => OTaskAsync(o))
.ToArray();
var results = await Task.WhenAll(tasks);
var combinedResults = results.Select(r => "result for O is: " + r);
Run Code Online (Sandbox Code Playgroud)
Sim*_*ger 34
您正在寻找Task.WaitAll
(假设您已TaskList
实施IEnumerable<Task>
)
Task.WaitAll(TaskList.ToArray());
Run Code Online (Sandbox Code Playgroud)
编辑:由于WaitAll
只接受一个任务数组(或Task
一个变量参数数组形式的列表),您必须转换您的Enumerable.如果你想要一个扩展方法,你可以这样做:
public static void WaitAll(this IEnumerable<Task> tasks)
{
Task.WaitAll(tasks.ToArray());
}
TaskList.WaitAll();
Run Code Online (Sandbox Code Playgroud)
但那真的只是语法糖.