C# 实现Parallel.For
2021/12/16 17:11:49
本文主要是介绍C# 实现Parallel.For,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
static class MyParallel { //4.0及以上用Task, Task的背后的实现也是使用了线程池线程 //static List<Task> tasks = new List<Task>(); //4.0以下用Thread static List<Thread> tasks = new List<Thread>(); //队列 static Queue<int[]> datas = new Queue<int[]>(); public static void For(int start, int end, Action<int> action) { //逻辑处理器数量 var taskAllCount = Environment.ProcessorCount*2; #region 每次处理的量 int pageSize = end / taskAllCount; if (pageSize == 0) { pageSize = 1; } #endregion #region 分配处理范围 var totalCount = end; for (int pageIndex = 0; totalCount >= 0; pageIndex++) { int pageStart = pageIndex * pageSize; int pageEnd = pageIndex * pageSize + pageSize; datas.Enqueue(new int[] { pageStart, pageEnd }); //入队 totalCount -= pageSize; } #endregion #region 根据逻辑处理器数量创建任务,并启动 int i = 0; while (tasks.Count < taskAllCount) { tasks.Add(new Thread(() => { while (datas.Count > 0) { var one = new int[] { end, end }; lock (datas) { one = datas.Dequeue(); } for (int j = one.First(); j < end && j < one.Last(); j++) { action(j); } System.Threading.Thread.Sleep(10); } })); tasks[i].IsBackground = true; tasks[i].Start(); i++; } #endregion //等待所有任务结束 foreach (var task in tasks) { task.Join(); task.Abort(); } tasks.Clear(); //Task.WaitAll(tasks.ToArray()); } }
性能测试
var list = new List<int>(1000); for (int i = 0; i < 1000; i++) { list.Add(i); } string startTime = DateTime.Now.ToString(); int ii = 0; MyParallel.For(0, list.Count, x => { Thread.Sleep(10); Console.WriteLine($"{x.ToString()},{ Interlocked.Increment(ref ii)}"); }); Console.WriteLine("Parallel.For " + startTime + "," + DateTime.Now); Console.ReadKey(); startTime = DateTime.Now.ToString(); foreach (var item in list) { Thread.Sleep(10); Console.WriteLine(item.ToString()); } Console.WriteLine("for" + startTime + "," + DateTime.Now); Console.ReadKey();
这篇关于C# 实现Parallel.For的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2022-03-01沐雪多租宝商城源码从.NetCore3.1升级到.Net6的步骤
- 2024-05-08首个适配Visual Studio平台的国产智能编程助手CodeGeeX正式上线!C#程序员必备效率神器!
- 2024-03-30C#设计模式之十六迭代器模式(Iterator Pattern)【行为型】
- 2024-03-29c# datetime tryparse
- 2024-02-21list find index c#
- 2024-01-24convert toint32 c#
- 2024-01-24Advanced .Net Debugging 1:你必须知道的调试工具
- 2024-01-24.NET集成IdGenerator生成分布式全局唯一ID
- 2024-01-23用CI/CD工具Vela部署Elasticsearch + C# 如何使用
- 2024-01-23.NET开源的简单、快速、强大的前后端分离后台权限管理系统