如何优化众所周知的耗时过程的工作队列

Lor*_*ori 7 c# task-parallel-library

我有一个IEnumerable动作,它们在执行时消耗的时间是排序的.现在我希望所有这些都能并行执行.有没有比这更好的解决方案?

IEnumerable<WorkItem> workItemsOrderedByTime = myFactory.WorkItems.DecendentOrderedBy(t => t.ExecutionTime);
Parallel.ForEach(workItemsOrderedByTime, t => t.Execute(), Environment.ProcessorCount);
Run Code Online (Sandbox Code Playgroud)

所以我的想法是首先根据他们需要完成的时间执行所有费用任务.

编辑:问题是,是否有一个更好的解决方案,以最少的时间完成所有.

Sco*_*ain 6

为了解决您的XY问题

因为否则可能会发生10个任务中的9个已完成,最后一个任务在1个核心上执行,而所有其他核心无效.

您需要做的是告诉Parallel.ForEach您一次只从源列表中获取一个项目.这样,当你完成最后一项时,你将不会在一个核心的队列中拥有一堆慢速工作项.

这可以通过使用Partitioner.Create和传入来完成EnumerablePartitionerOptions.NoBuffering

Parallel.ForEach(Partitioner.Create(workItems, EnumerablePartitionerOptions.NoBuffering), 
                new ParallelOptions{MaxDegreeOfParallelism = Environment.ProcessorCount},
                t => t.Execute());
Run Code Online (Sandbox Code Playgroud)