时间:2021-05-20
多线程(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# 多线程处理多个数据的资料请关注其它相关文章!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了C#多线程处理多个队列数据的方法。分享给大家供大家参考。具体实现方法如下:usingSystem;usingSystem.Collections.
C#多线程与异步的区别详解随着拥有多个硬线程CPU(超线程、双核)的普及,多线程和异步操作等并发程序设计方法也受到了更多的关注和讨论。本文主要是想与各位高手一同
问题:对于多线程编程,很多时候往往需要向线程中传递多个参数,而C#中的线程只接收1个object类型的参数(如下):Threadt=newThread(newP
本文实例讲述了C#基于委托实现多线程之间操作的方法。分享给大家供大家参考,具体如下:有的时候我们要起多个线程,更多的时候可能会有某个线程会去操作其他线程里的属性
本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下:使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的