C# 多线程与高并发处理并且具备暂停、继续、停止功能

--近期有一个需要运用多线程的项目,会有并发概率,所以写了一份代码,可能有写地方还不完善,后续有需求在改
1
/// <summary> 2 /// 并发对象 3 /// </summary> 4 public class MeterAsyncQueue 5 { 6 public MeterAsyncQueue() 7 { 8 MeterInfoTask = new MeterInfo(); 9 } 10 11 public MeterInfo MeterInfoTask { get; set; } 12 } 13 public class MeterInfo 14 { 15 public MeterInfo() 16 { 17 18 } 19 public int Id { get; set; } 20 21 }
  1     /// <summary>
  2     /// 线程通用类
  3     /// </summary>
  4     public class TaskCommand
  5     {
  6         CancellationTokenSource tokenSource = new CancellationTokenSource();
  7         ManualResetEvent resetEvent = new ManualResetEvent(true);
  8         Thread thread = null;
  9         /// <summary>
 10         /// 开始任务
 11         /// </summary>
 12         public void StartData()
 13         {
 14             tokenSource = new CancellationTokenSource();
 15             resetEvent = new ManualResetEvent(true);
 16 
 17             List<int> Ids = new List<int>();
 18             for (int i = 0; i < 10000; i++)
 19             {
 20                 Ids.Add(i);
 21             }
 22             thread = new Thread(new ThreadStart(() => StartTask(Ids)));
 23             thread.Start();
 24         }
 25         /// <summary>
 26         /// 暂停任务
 27         /// </summary>
 28         public void OutData()
 29         {
 30             //task暂停
 31             resetEvent.Reset();
 32         }
 33         /// <summary>
 34         /// 继续任务
 35         /// </summary>
 36         public void ContinueData()
 37         {
 38             //task继续
 39             resetEvent.Set();
 40         }
 41         /// <summary>
 42         /// 取消任务
 43         /// </summary>
 44         public void Cancel()
 45         {
 46             //释放对象
 47             resetEvent.Dispose();
 48             foreach (var CurrentTask in ParallelTasks)
 49             {
 50                 if (CurrentTask != null)
 51                 {
 52                     if (CurrentTask.Status == TaskStatus.Running) { }
 53                     {
 54                         //终止task线程
 55                         tokenSource.Cancel();
 56                     }
 57                 }
 58             }
 59             thread.Abort();
 60         }
 61         /// <summary>
 62         /// 执行数据
 63         /// </summary>
 64         /// <param name="Index"></param>
 65         public void Execute(int Index)
 66         {
 67             //阻止当前线程
 68             resetEvent.WaitOne();
 69 
 70             Console.WriteLine("当前第" + Index + "个线程");
 71 
 72             Thread.Sleep(1000);
 73 
 74         }
 75         //队列对象
 76         private Queue<MeterAsyncQueue> AsyncQueues { get; set; }
 77 
 78         /// <summary>
 79         /// 并发任务数
 80         /// </summary>
 81         private int ParallelTaskCount { get; set; }
 82 
 83 
 84         /// <summary>
 85         /// 并行任务集合
 86         /// </summary>
 87         private List<Task> ParallelTasks { get; set; }
 88         //控制线程并行数量
 89         public void StartTask(List<int> Ids)
 90         {
 91             IsInitTask = true;
 92             ParallelTasks = new List<Task>();
 93             AsyncQueues = new Queue<MeterAsyncQueue>();
 94             //获取并发数
 95             ParallelTaskCount = 5;
 96 
 97             //初始化异步队列
 98             InitAsyncQueue(Ids);
 99             //开始执行队列任务
100             HandlingTask();
101 
102             Task.WaitAll(new Task[] { Task.WhenAll(ParallelTasks.ToArray()) });
103         }
104         /// <summary>
105         /// 初始化异步队列
106         /// </summary>
107         private void InitAsyncQueue(List<int> Ids)
108         {
109             foreach (var item in Ids)
110             {
111                 MeterInfo info = new MeterInfo();
112                 info.Id = item;
113                 AsyncQueues.Enqueue(new MeterAsyncQueue()
114                 {
115                     MeterInfoTask = info
116                 });
117             }
118         }
119         /// <summary>
120         /// 是否首次执行任务
121         /// </summary>
122         private bool IsInitTask { get; set; }
123         //
124         private readonly object _objLock = new object();
125 
126         /// <summary>
127         /// 开始执行队列任务
128         /// </summary>
129         private void HandlingTask()
130         {
131             lock (_objLock)
132             {
133                 if (AsyncQueues.Count <= 0)
134                 {
135                     return;
136                 }
137 
138                 var loopCount = GetAvailableTaskCount();
139                 //并发处理队列
140                 for (int i = 0; i < loopCount; i++)
141                 {
142                     HandlingQueue();
143                 }
144                 IsInitTask = false;
145             }
146         }
147         /// <summary>
148         /// 获取队列锁
149         /// </summary>
150         private readonly object _queueLock = new object();
151 
152         /// <summary>
153         /// 处理队列
154         /// </summary>
155         private void HandlingQueue()
156         {
157             CancellationToken token = tokenSource.Token;
158             lock (_queueLock)
159             {
160                 if (AsyncQueues.Count > 0)
161                 {
162                     var asyncQueue = AsyncQueues.Dequeue();
163 
164                     if (asyncQueue == null) return;
165                     var task = Task.Factory.StartNew(() =>
166                     {
167                         if (token.IsCancellationRequested)
168                         {
169                             return;
170                         }
171                         //阻止当前线程
172                         resetEvent.WaitOne();
173                         //执行任务
174                         Execute(asyncQueue.MeterInfoTask.Id);
175 
176                     }, token).ContinueWith(t =>
177                     {
178                         HandlingTask();
179                     }, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously);
180                     ParallelTasks.Add(task);
181                 }
182             }
183         }
184         /// <summary>
185         /// 获取当前有效并行的任务数
186         /// </summary>
187         /// <returns></returns>
188         [MethodImpl(MethodImplOptions.Synchronized)]
189         private int GetAvailableTaskCount()
190         {
191             if (IsInitTask)
192                 return ParallelTaskCount;
193             return 1;
194         }
195     }

 

转载于:https://www.cnblogs.com/wt-vip/p/11599059.html

多线程启动停止暂停继续 -Begin- 前言 初学者学习编程时,很容易因为多线程出现各种问题,导致不敢使用多线程。但是多线程技术在做开发中,是不可忽视的一个技术,基本上我们实际应用中,每个项目都会使用多线程,所以多线程技术必须掌握。 为什么要用多线程 随着工业的进步,现在的笔记本、台式机大都是双核的,4核、8核甚至16核,也很常见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。 单核CPU上所谓的”多线程”那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看 阅读详情

相关推荐

掌控多线程的命脉:C#线程启动、暂停终止的终极实践

在现代应用程序开发中,如何有效地管理多线程是至关重要的。无论是处理大量并发请求、执行复杂计算,还是异步操作,多线程技术都能极大地提升程序的性能和响应能力。而在 C# 中,线程控制的实现,尤其是启动、暂停、恢复和终止,往往是开发者面对的难题之一。在这篇文章中,我们将深入探讨如何在 C# 中实现线程的精确控制,从而让你在开发中得心应手地“掌控多线程的命脉”。我们将通过具体示例展示如何实现线程的启动、暂停继续停止,并讨论常见的多线程控制技巧。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1180

C#多线程并行管理,通过Task实现,可随时暂停,继续以及停止

C#多线程并行管理,通过Task实现,可对单个任务进行暂停,继续以及停止等操作,每个任务均有单独的进度条显示 同时执行的任务个数可以自行设置

C#多线程控制:暂停继续停止的实现案例分析

在现代软件开发中,多线程是提高应用程序性能和响应性的关键技术之一。C#作为一门面向对象的编程语言,提供了丰富的线程操作支持。本章节将介绍C#中的线程创建、启动和管理的基本知识。在多线程编程中,同步原语是用来控制对共享资源的访问的机制。这些原语可以防止数据竞争和条件竞争,确保线程间的同步和协作。锁(Locks):也称为互斥锁,是一种控制多个线程对共享资源进行访问控制的基本方法。它允许多个线程执行同一个代码块,但一次只允许一个线程进入该代码块。C#中使用lock关键字来实现锁机制。

weixin_31597759的博客 1647

Task启动,暂停继续,结束

有1个完成3就run。12都完成3才run。

cfqq1989的博客 2万+

C# 教你如何终止Task线程

C# TASK 取消的方法

qq_26800875的博客 7269

C#控制多线程最大并行数量

君子居易 1472

c#解决高并发--加锁(Lock)

private static object sign = new object(); public static DBHelper CreateMapping(string connStr = "") { DBHelper db = new DBHelper(connStr); return db; ...

weixin_30567471的博客 4139

C#实现请求唯一性校验支持高并发

作者:龙腾-hyl源文:cnblogs.com/huangyoulong/p/11611145.html使用场景描述网络请求中经常会遇到发送的请求,服务端响应是成功的,但是返回的时候出现...

hailang2ll的专栏 829

C#实现多线程的启动、停止暂停继续

通过上面的示例,我们展示了如何在 C# 中使用Thread类配合来控制线程的启动、停止暂停继续。提供了一种简单且有效的方式来在多线程应用程序中同步和控制线程的执行。这个方案可以广泛应用于需要线程暂停恢复的场景,如实时数据处理、后台任务和工作流管理等。如果你有更复杂的线程管理需求,还可以使用其他更高级的线程同步工具,如Task和等。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 4222

C#多线程——Thread睡眠、中断、合并、暂停恢复、终止

C#多线程的一些操作,Sleep、Join、Interupt、暂停恢复(重点)、终止

AronZhang的博客 3万+

C#下如何控制并发运行的Task数量

首先需要说明的是Task不等于Thread,只是微软默认实现ThreadPoolTaskScheduler是依赖于线程池的,因为该类的可访问性为internal,所以我们在实际编码中无法直接在代码中new这么一个Scheduler出来,只能通过TaskScheduler.Default间接的来使用 好了上面好像偏题了,回到原题,为什么需要控制Task数量?假设有这样一个场景,有一批Task需执行

sky 胡萝卜星星 3万+

c#中使用Task

Task.Factory.StartNew比Task.Run有更多的参数选择项,偶尔也需要根据实际场景选择Task.Factory.StartNew,但是Task.Run的用法比较简介,已经可以满足大多数的场景。1.界面业务说明,label1是加法计算,分别有3个功能,对label1停止加法,暂停加法,继续加法。可以先看前面的backgroudwork文章,再看Thread文章,本demo接着Thread的环境继续。在Task中进行停止暂停继续功能并且在Task中进行停止暂停继续功能

故里2130 1万+

C# Task 多线程 开始 暂停 停止

多线程

dawei.tu的博客 4055

C# Task 暂停取消

C# Task 暂停取消

DotnetNb的博客 3225
上一篇: 【跳转】C# VS发布到IIS Express,允许外网调试(如微信开发)
dcli98004
博客等级 码龄12年 0粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值