gpt4 book ai didi

c# - 异步foreach

转载 作者:太空狗 更新时间:2023-10-29 17:31:31 27 4
gpt4 key购买 nike

有没有办法在 C# 中实现异步 foreach?其中 id(s) 将由方法异步处理,而不是使用 Parallel.ForEach

//This Gets all the ID(s)-IEnumerable <int>
var clientIds = new Clients().GetAllClientIds();

Parallel.ForEach(clientIds, ProcessId); //runs the method in parallel

static void ProcessId(int id)
{
// just process the id
}

应该是一个 foreach 但异步运行

foreach(var id in clientIds)
{
ProcessId(id) //runs the method with each Id asynchronously??
}

我正在尝试在控制台中运行该程序,它应该等待所有 id(s) 完成处理后再关闭控制台。

最佳答案

不,这真的不可能。

而不是在 foreach 循环中添加你想做的作为 Task for Task 集合,然后使用 Task.WaitAll。

var tasks = new List<Task>();

foreach(var something in somethings)
tasks.Add(DoJobAsync(something));

await Task.WhenAll(tasks);

请注意,DoJobAsync 方法应返回 Task。

更新:

如果您的方法不返回 Task 而返回其他东西(例如 void),您有两个基本相同的选项:

1.改为将 Task.Run(action) 添加到任务集合中

tasks.Add(Task.Run(() => DoJob(something)));

2.在返回任务的方法中包装您的同步方法

 private Task DoJobAsync(Something something)
{
return Task.Run(() => DoJob(something));
}

您还可以使用 Task<TResult>如果您想从任务执行中接收一些结果,则通用。

关于c# - 异步foreach,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40091686/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com