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)
所以我的想法是首先根据他们需要完成的时间执行所有费用任务.
编辑:问题是,是否有一个更好的解决方案,以最少的时间完成所有.
为了解决您的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)
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |