首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >运行多个异步任务并等待它们全部完成

运行多个异步任务并等待它们全部完成
EN

Stack Overflow用户
提问于 2014-07-29 14:34:29
回答 5查看 319.3K关注 0票数 318

我需要在控制台应用程序中运行多个异步任务,并在进一步处理之前等待它们全部完成。

有很多文章,但我读得越多,似乎就越困惑。我已经阅读并理解了任务库的基本原理,但我显然缺少一个链接。

我知道可以链接任务,以便它们在另一个任务完成后开始(这几乎就是我读过的所有文章的情况),但我希望我的所有任务同时运行,并且我想知道它们都完成后的情况。

对于这样的场景,最简单的实现是什么?

EN

回答 5

Stack Overflow用户

发布于 2014-07-29 14:45:43

您可以创建许多任务,如:

代码语言:javascript
复制
List<Task> TaskList = new List<Task>();
foreach(...)
{
   var LastTask = new Task(SomeFunction);
   LastTask.Start();
   TaskList.Add(LastTask);
}

Task.WaitAll(TaskList.ToArray());
票数 122
EN

Stack Overflow用户

发布于 2015-09-14 04:52:42

我见过的最好的选择是下面的扩展方法:

代码语言:javascript
复制
public static Task ForEachAsync<T>(this IEnumerable<T> sequence, Func<T, Task> action) {
    return Task.WhenAll(sequence.Select(action));
}

这样叫它:

代码语言:javascript
复制
await sequence.ForEachAsync(item => item.SomethingAsync(blah));

或者使用异步lambda:

代码语言:javascript
复制
await sequence.ForEachAsync(async item => {
    var more = await GetMoreAsync(item);
    await more.FrobbleAsync();
});
票数 31
EN

Stack Overflow用户

发布于 2018-10-17 19:53:04

当我需要同时加载数据并将其放入变量时,我通常会发现自己的另一个answer...but,例如:

代码语言:javascript
复制
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
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25009437

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档