C开发入门到精通之C#多线程处理多个队列数据的方法
小职 2021-06-15 来源 :后端Q 阅读 894 评论 0

摘要:本文主要介绍了C开发入门到精通之C#多线程处理多个队列数据的方法,通过具体的内容向大家展现,希望对大家C#开发的学习有所帮助。

本文主要介绍了C开发入门到精通之C#多线程处理多个队列数据的方法,通过具体的内容向大家展现,希望对大家C#开发的学习有所帮助。

概述

多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。

 

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。

 

比如平常我们在处理定时任务的时候,假设就一台机器,我们不可能单线程一条一条数据的去跑,这时候就需要提高机器资源的利用率。

 

下面我们来介绍下,如何实现多线程+队列以提高并发处理能力。

 

代码实现

1、定义线程数threadNum和队列queues

 

/// <summary>

        /// 线程总数

        /// </summary>

        private int threadNum = 4;

 

        /// <summary>

        /// 总数

        /// </summary>

        private int totalCount = 0;

 

        /// <summary>

        /// 已处理

        /// </summary>

        private int index = 0;

 

        /// <summary>

        /// 队列

        /// </summary>

        private ConcurrentQueue<AssetRepayment> queues = new ConcurrentQueue<AssetRepayment>();

2、定义线程列表,往线程添加数据

 

public void SubDeTransaction()

        {

            var list = new List<AssetRepayment>();

            for (int i = 0; i < 1000; i++)

            {

                list.Add(new AssetRepayment() { Title = i.ToString() + "---" + Guid.NewGuid().ToString() });

            }

 

            if (list == null || list.Count() == 0)

            {

                Console.WriteLine("没有可执行的数据");

                return;

            }

            totalCount = list.Count;

            Console.WriteLine("可执行的数据:" + list.Count() + "条");

            foreach (var item in list)

            {

                queues.Enqueue(item);

            }

            List<Task> tasks = new List<Task>();

            for (int i = 0; i < threadNum; i++)

            {

                var task = Task.Run(() =>

                {

                    Process();

                });

                tasks.Add(task);

            }

            var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) =>

            {

            });

            taskList.Wait();

        }

3、对线程数进行限制 for (int i = 0; i < threadNum; i++)

 

var taskList = Task.Factory.ContinueWhenAll(tasks.ToArray(), (ts) =>

            {

            });

            taskList.Wait();

4、从队列取出数据进行业务处理

 

private void Process()

        {

            while (true)

            {

                var currentIndex = Interlocked.Increment(ref index);

                AssetRepayment repayId = null;

                var isExit = queues.TryDequeue(out repayId);

                if (!isExit)

                {

                    break;

                }

                try

                {

                    Console.WriteLine(repayId.Title);

 

                    Console.WriteLine(string.Format(" 共{0}条 当前第{1}条", totalCount, currentIndex));

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex);

                }

            }

        }

运行测试

 C开发入门到精通之C#多线程处理多个队列数据的方法

 

 

代码地址

 

https://gitee.com/conanOpenSource_admin/Example


我是小职,记得找我

✅ 解锁高薪工作

✅ 免费获取基础课程·答疑解惑·职业测评

C开发入门到精通之C#多线程处理多个队列数据的方法

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程