【问题标题】:Scope of Parallel.Foreach MaxDegreeOfParallelismParallel.Foreach MaxDegreeOfParallelism 的范围
【发布时间】:2016-02-25 08:59:55
【问题描述】:

我正在使用 Parallel.Foreach 来处理多个并发任务。我通过指定 MaxDegreeOfParalellism 来限制并发操作的数量。因此,现在如果我在该 foreach 之外启动另一个任务,那么最大并发操作限制将应用于该任务。

Parallel.ForEach(tasks, new ParallelOptions { MaxDegreeOfParallelism = MaxInstances }, task=>
                    {////Some OPeration///}


Task.Factory.StartNew(action)

如果最大限制为 8 并且 Foreach 中已经在运行 8 个并发任务。是否会在 foreach 之外运行任务?

【问题讨论】:

  • 在给定的示例中,任务将运行,因为在它启动时,并行 foreach 已完成并且其所有任务都已完成。
  • 我的意思是说,如果一个单独的线程在执行 foreach 时尝试在 foreach 之外执行任务。

标签: c# task-parallel-library


【解决方案1】:

不,您应用于Parallel.ForEach() 的选项仅影响Parallel.ForEach(),它们不会直接影响任何其他代码。

(其实你对Parallel.ForEach()的限制越多,越有可能其他Task会立即执行。这是因为你的Parallel.ForEach()会使用更少的ThreadPool的线程,留下更多的他们免费为其他人。)

【讨论】:

  • 那么我如何为所有任务设置线程池限制,无论是在parallel.foreach内部还是在它之外。?
  • 这可能不是一个好主意,但您可以致电ThreadPool.SetMaxThreads() 来实现。什么是正确的解决方案取决于您为什么要这样做。
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 2021-08-21
  • 2017-08-06
  • 2013-10-03
  • 1970-01-01
  • 2013-12-13
  • 1970-01-01
  • 2016-04-22
相关资源
最近更新 更多