全部好,
我的查询是关于TaskParallel库的实现。
我有一份清单。我需要并行执行所有任务,并且在任何时间点执行的任务数量应为3.即,如果我有9个任务,则最初应该启动前3个任务,如果任何1个任务完成,应该启动下一个,并且在任何时间点都应该运行不超过3个任务。
实施此方法的最佳方法是什么?
谢谢!
答案 0 :(得分:2)
如果您使用Parallel::ForEach,则可以使用需要ParallelOptions
的重载,您可以在其上设置MaxDegreeOfParallelism = 3
。如果您使用PLINQ,可以使用WithDegreeOfParallelism(3)
。
请记住,这仅限制了在任何给定时间可能正在执行工作的最大线程数,确实/不能保证所有三个线程都必须能够启动/运行马上。
答案 1 :(得分:0)
您可以实现一个限制并行度的调度程序。
http://msdn.microsoft.com/en-us/library/ee789351.aspx
我不清楚你的场景,但是这种方法可以用来限制正在执行的任务的最大数量,但可能不会保证三个一直运行,只是一次不能运行三个。
另一种方法可能是启动三个任务并让它们从ConcurrentQueue中读取数据,其中包含执行实际工作所需的信息。这将允许您始终并行执行三件事。
基本上你正在做的事情与TPL背后的哲学有些不一致,TPL实际上是将你的工作表达为潜在的并行性,并将运行时安排在尽可能多的内核上。
答案 2 :(得分:0)
你有没有看过System.Threading?有一个Parallel类,看起来就像你要找的那样。