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

软件发布|下载排行|最新软件

当前位置:首页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

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们