Parallel中分区器Partitioner的简单使用
Partitioner.Create(1,10,4).GetDynamicPartitions()
为长度为10的序列创建分区,每个分区至多4个元素,分区方法及结果:Partitioner.Create(0, 10, 4).GetDynamicPartitions()

得到3个前闭后开区间: [0, 4)即{0, 1, 2, 3}, [4, 8)即{4, 5, 6, 7}, [8, 10)即{8, 9}, 注意被枚举的数字均为数组下标;
为长度为10的序列创建分区,至多4个分区,分区方法及结果: Partitioner.Create(0, 10, 3).GetDynamicPartitions()

得到4个前闭后开区间: [0,3)即{0, 1, 2}, [3, 6)即{3, 4, 5}, [6, 9)即{6, 7, 8}, [9, 10)即{9}, 注意被枚举的数字均为数组下标;
定义分区个数 = 定义并发线程(笔者这样讲并不严格), 故定义方法如下:
private static void NewMethod<T>(IList<T> array, Int32 rangeCount) {
var rangeSize = (Int32)Math.Ceiling(array.Count / (Double)rangeCount);
var part = Partitioner.Create(0, array.Count, rangeSize);
Parallel.ForEach(part, (range, state, rangeIndex) => {
for (Int32 index = range.Item1; index < range.Item2; index++) {
Console.WriteLine("[{0,2}] {1} {2}", Thread.CurrentThread.ManagedThreadId, rangeIndex, index);
}
});
}
对于分区个数定义为3, 可以看到线程ID 在1,3,4中切换, 线程[1]遍历了4个元素, 线程[3]遍历了4个元素, 线程[4]遍历了2个元素

对于分区个数定义为4, 可以看到线程ID 在1, 3, 4, 5中切换, 线程[1]遍历了3个元素, 线程[3]遍历了3个元素, 线程[4]遍历了3个元素, 线程5遍历了1个元素.

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!