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

 更新时间:2021年06月10日 08:55:54   作者:conan  
本文将结合实例代码,介绍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

到此这篇关于C#多线程处理多个队列数据的方法的文章就介绍到这了,更多相关C#多线程处理多个队列数据的方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C#获取指定文件著作权信息的方法

    C#获取指定文件著作权信息的方法

    这篇文章主要介绍了C#获取指定文件著作权信息的方法,涉及C#中FileVersionInfo类的使用技巧,需要的朋友可以参考下
    2015-04-04
  • C#用户控件之温度计设计

    C#用户控件之温度计设计

    这篇文章主要为大家详细介绍了C#用户控件之温度计的设计方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • 谈C# using的用法与好处

    谈C# using的用法与好处

    这篇文章主要为大家详细介绍了C# using的用法与好处,具体分析了using指令调用的Dispose()方法,感兴趣的朋友可以参考一下
    2016-05-05
  • C#留言时间格式化

    C#留言时间格式化

    本文给大家分享的是仿微博或者空间中,发布内容之后提示NN秒之前留言的代码,主要是通过发布时间和当前时间直接的差值来计算,十分的简单实用,有需要的小伙伴可以参考下。
    2015-05-05
  • C#中获取文件大小问题

    C#中获取文件大小问题

    这篇文章主要介绍了C#中获取文件大小问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • C#与C++动态链接库DLL参数互传方式

    C#与C++动态链接库DLL参数互传方式

    这篇文章主要介绍了C#与C++动态链接库DLL参数互传方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • WCF实现进程间管道通信Demo分享

    WCF实现进程间管道通信Demo分享

    下面小编就为大家分享一篇WCF实现进程间管道通信Demo,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • C#线程处理系列之线程池中的I/O线程

    C#线程处理系列之线程池中的I/O线程

    这篇文章主要介绍了C#线程处理系列之线程池中的I/O线程,在这篇文章中将介绍如何用线程池中的I/O线程来执行I/O操作,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • c# wpf如何使用Blend工具绘制Control样式

    c# wpf如何使用Blend工具绘制Control样式

    这篇文章主要介绍了c# wpf如何使用Blend工具绘制Control样式,帮助大家更好的理解和学习使用c#,感兴趣的朋友可以了解下
    2021-03-03
  • winfrom 打印表格 字符串的封装实现代码 附源码下载

    winfrom 打印表格 字符串的封装实现代码 附源码下载

    以前写打印都是根据打印机的型号,找开发类库。然后在此基础上开发。写的多了自然就想到了封装。这是还是想到了微软,微软封装了PrintDocument的打印类。但这只是在低层对串口的封装
    2013-02-02

最新评论