我需要在控制台应用程序中运行多个异步任务,并在进一步处理之前等待它们全部完成。
有很多文章,但我读得越多,似乎就越困惑。我已经阅读并理解了任务库的基本原理,但我显然缺少一个链接。
我知道可以链接任务,以便它们在另一个任务完成后开始(这几乎就是我读过的所有文章的情况),但我希望我的所有任务同时运行,并且我想知道它们都完成后的情况。
对于这样的场景,最简单的实现是什么?
发布于 2014-07-29 14:45:43
您可以创建许多任务,如:
List<Task> TaskList = new List<Task>();
foreach(...)
{
var LastTask = new Task(SomeFunction);
LastTask.Start();
TaskList.Add(LastTask);
}
Task.WaitAll(TaskList.ToArray());
发布于 2015-09-14 04:52:42
我见过的最好的选择是下面的扩展方法:
public static Task ForEachAsync<T>(this IEnumerable<T> sequence, Func<T, Task> action) {
return Task.WhenAll(sequence.Select(action));
}
这样叫它:
await sequence.ForEachAsync(item => item.SomethingAsync(blah));
或者使用异步lambda:
await sequence.ForEachAsync(async item => {
var more = await GetMoreAsync(item);
await more.FrobbleAsync();
});
发布于 2018-10-17 19:53:04
当我需要同时加载数据并将其放入变量时,我通常会发现自己的另一个answer...but,例如:
var cats = new List<Cat>();
var dog = new Dog();
var loadDataTasks = new Task[]
{
Task.Run(async () => cats = await LoadCatsAsync()),
Task.Run(async () => dog = await LoadDogAsync())
};
try
{
await Task.WhenAll(loadDataTasks);
}
catch (Exception ex)
{
// handle exception
}
https://stackoverflow.com/questions/25009437
复制相似问题