【问题标题】:Simple .NET method of a parallel work queue with controllable concurrency具有可控并发性的并行工作队列的简单 .NET 方法
【发布时间】:2022-09-30 15:15:07
【问题描述】:

这听起来像是一个过于琐碎的问题,而且我认为我过于复杂了,因为我已经好几个月没有找到答案了。在 Golang、Scala/Akka 等中有很简单的方法可以做到这一点,但我似乎在 .NET 中找不到任何东西。

我需要的是拥有一个相互独立的任务列表的能力,以及在指定(且易于更改)数量的线程上同时执行它们的能力。

基本上是这样的:


int numberOfParallelThreads = 3;                // changeable
Queue<Task> pendingTasks = GetPendingTasks();   // returns 80 items

await SomeBuiltInDotNetParallelExecutableManager.RunAllTasksWithSpecifiedConcurrency(pendingTasks, numberOfParallelThreads);

SomeBuiltInDotNetParallelExecutableManager 将一次执行 80 个任务,三个;即当一个完成时,它会从队列中抽取下一个,直到队列用完。

Task.WhenAllTask.WaitAll,但不能指定其中的最大并行线程数。

是否有内置的简单方法可以做到这一点?

    标签: c# .net multithreading threadpool


    【解决方案1】:

    Parallel.ForEachAsync?

    IEnumerable<int> x = ...;
    
    await Parallel.ForEachAsync(x, new ParallelOptions
    {
        MaxDegreeOfParallelism = 3
    }, async (i, token) => await Task.Delay(i * 1000, token));
    

    另请注意,强烈建议 C# 中的方法返回所谓的“热”,即已启动的任务,因此“惯用”Queue&lt;Task&gt; 应该是已启动任务的集合,因此您将无法控制它们执行的数量。

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多