gpt4 book ai didi

c# - 并行运行任务

转载 作者:行者123 更新时间:2023-12-02 15:16:43 27 4
gpt4 key购买 nike

我无法理解为什么这似乎不能并行运行任务:

var tasks = new Task<MyReturnType>[mbis.Length];

for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = CAS.Service.GetAllRouterInterfaces(mbis[i], 3);
}

Parallel.ForEach(tasks, task => task.Start());

通过单步执行,我看到这一行被评估后:

tasks[i] = CAS.Service.GetAllRouterInterfaces(mbis[i], 3);

任务开始。我想将所有新任务添加到列表中,然后并行执行它们。

最佳答案

如果 GetAllRouterInterfaces 是一个 async 方法,则生成的 Task 将已经启动(请参阅 this answer 了解更多说明)。

这意味着tasks将包含多个并行运行的任务,而无需随后调用Parallel.ForEach

您可能希望等待 tasks 中的所有条目完成,您可以使用 await Task.WhenAll(tasks); 来完成此操作。

所以你最终应该得到:

var tasks = new Task<MyReturnType>[mbis.Length];

for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = CAS.Service.GetAllRouterInterfaces(mbis[i], 3);
}

await Task.WhenAll(tasks);

评论更新

看起来,尽管GetAllRouterInterfaces异步并返回Task,但它仍然在发出同步POST请求(大概在任何其他之前)等待)。这可以解释为什么在发出此请求时,每次调用 GetAllRouterInterfaces 都会阻塞,因此您会获得最小的并发性。理想的解决方案是发出异步 POST 请求,例如:

await webclient.PostAsync(request).ConfigureAwait(false);

这将确保您的 for 循环不会被阻塞并且请求是并发发出的。

对话后进一步更新

看来您无法使 POST 请求异步,并且 GetAllRouterInterfaces 实际上并未执行任何异步工作,因此我建议如下:

  1. GetAllRouterInterfaces 中删除 async 并将返回类型更改为 MyReturnType
  2. 像这样并行调用GetAllRouterInterfaces

    var routerInterfaces = mbis.AsParallel()
    .Select(mbi => CAS.Service.GetAllRouterInterfaces(mbi, 3));

关于c# - 并行运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35639243/

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