ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C# 实现Parallel.For

2021-12-16 16:35:30  阅读:151  来源: 互联网

标签:tasks Console pageSize C# 实现 int var new Parallel


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();

 

标签:tasks,Console,pageSize,C#,实现,int,var,new,Parallel
来源: https://www.cnblogs.com/212s/p/15698768.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有