纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

C# 多队列数据处理 C#多线程处理多个队列数据的方法

conan   2021-06-10 我要评论
想了解C#多线程处理多个队列数据的方法的相关内容吗conan在本文为您仔细讲解C# 多队列数据处理的相关知识和一些Code实例欢迎阅读和指正我们先划重点: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); 
                } 
            } 
        } 

运行测试

代码地址

https://gitee.com/conanOpenSource_admin/Example


相关文章

猜您喜欢

  • JS 堆栈 拷贝 详解JavaScript堆栈与拷贝

    想了解详解JavaScript堆栈与拷贝的相关内容吗lsgxeva在本文为您仔细讲解JS 堆栈 拷贝的相关知识和一些Code实例欢迎阅读和指正我们先划重点:javascript,堆栈,javascript,拷贝,js,堆栈,js,拷贝下面大家一起来学习吧。..
  • vue3 setUp和reactive函数 详解vue3中setUp和reactive函数的用法

    想了解详解vue3中setUp和reactive函数的用法的相关内容吗平凡是最美荡气回肠在本文为您仔细讲解vue3 setUp和reactive函数的相关知识和一些Code实例欢迎阅读和指正我们先划重点:vue3,setUp函数,vue,reactive函数下面大家一起来学习吧。..

网友评论

Copyright 2020 www.Shellfishsoft.com 【贝软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式