C# 多线程与高并发处理并且具备暂停、继续、停止功能
--近期有一个需要运用多线程的项目,会有并发概率,所以写了一份代码,可能有写地方还不完善,后续有需求在改
1 /// <summary>
/// 并发对象
/// </summary>
public class MeterAsyncQueue
{
public MeterAsyncQueue()
{
MeterInfoTask = new MeterInfo();
} public MeterInfo MeterInfoTask { get; set; }
}
public class MeterInfo
{
public MeterInfo()
{ }
public int Id { get; set; } }
/// <summary>
/// 线程通用类
/// </summary>
public class TaskCommand
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
ManualResetEvent resetEvent = new ManualResetEvent(true);
Thread thread = null;
/// <summary>
/// 开始任务
/// </summary>
public void StartData()
{
tokenSource = new CancellationTokenSource();
resetEvent = new ManualResetEvent(true); List<int> Ids = new List<int>();
for (int i = ; i < ; i++)
{
Ids.Add(i);
}
thread = new Thread(new ThreadStart(() => StartTask(Ids)));
thread.Start();
}
/// <summary>
/// 暂停任务
/// </summary>
public void OutData()
{
//task暂停
resetEvent.Reset();
}
/// <summary>
/// 继续任务
/// </summary>
public void ContinueData()
{
//task继续
resetEvent.Set();
}
/// <summary>
/// 取消任务
/// </summary>
public void Cancel()
{
//释放对象
resetEvent.Dispose();
foreach (var CurrentTask in ParallelTasks)
{
if (CurrentTask != null)
{
if (CurrentTask.Status == TaskStatus.Running) { }
{
//终止task线程
tokenSource.Cancel();
}
}
}
thread.Abort();
}
/// <summary>
/// 执行数据
/// </summary>
/// <param name="Index"></param>
public void Execute(int Index)
{
//阻止当前线程
resetEvent.WaitOne(); Console.WriteLine("当前第" + Index + "个线程"); Thread.Sleep(); }
//队列对象
private Queue<MeterAsyncQueue> AsyncQueues { get; set; } /// <summary>
/// 并发任务数
/// </summary>
private int ParallelTaskCount { get; set; } /// <summary>
/// 并行任务集合
/// </summary>
private List<Task> ParallelTasks { get; set; }
//控制线程并行数量
public void StartTask(List<int> Ids)
{
IsInitTask = true;
ParallelTasks = new List<Task>();
AsyncQueues = new Queue<MeterAsyncQueue>();
//获取并发数
ParallelTaskCount = ; //初始化异步队列
InitAsyncQueue(Ids);
//开始执行队列任务
HandlingTask(); Task.WaitAll(new Task[] { Task.WhenAll(ParallelTasks.ToArray()) });
}
/// <summary>
/// 初始化异步队列
/// </summary>
private void InitAsyncQueue(List<int> Ids)
{
foreach (var item in Ids)
{
MeterInfo info = new MeterInfo();
info.Id = item;
AsyncQueues.Enqueue(new MeterAsyncQueue()
{
MeterInfoTask = info
});
}
}
/// <summary>
/// 是否首次执行任务
/// </summary>
private bool IsInitTask { get; set; }
//锁
private readonly object _objLock = new object(); /// <summary>
/// 开始执行队列任务
/// </summary>
private void HandlingTask()
{
lock (_objLock)
{
if (AsyncQueues.Count <= )
{
return;
} var loopCount = GetAvailableTaskCount();
//并发处理队列
for (int i = ; i < loopCount; i++)
{
HandlingQueue();
}
IsInitTask = false;
}
}
/// <summary>
/// 获取队列锁
/// </summary>
private readonly object _queueLock = new object(); /// <summary>
/// 处理队列
/// </summary>
private void HandlingQueue()
{
CancellationToken token = tokenSource.Token;
lock (_queueLock)
{
if (AsyncQueues.Count > )
{
var asyncQueue = AsyncQueues.Dequeue(); if (asyncQueue == null) return;
var task = Task.Factory.StartNew(() =>
{
if (token.IsCancellationRequested)
{
return;
}
//阻止当前线程
resetEvent.WaitOne();
//执行任务
Execute(asyncQueue.MeterInfoTask.Id); }, token).ContinueWith(t =>
{
HandlingTask();
}, TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously);
ParallelTasks.Add(task);
}
}
}
/// <summary>
/// 获取当前有效并行的任务数
/// </summary>
/// <returns></returns>
[MethodImpl(MethodImplOptions.Synchronized)]
private int GetAvailableTaskCount()
{
if (IsInitTask)
return ParallelTaskCount;
return ;
}
}
C# 多线程与高并发处理并且具备暂停、继续、停止功能的更多相关文章
- puma(5300✨) Rails的一个多线程,高并发处理的web server
https://github.com/puma/puma 在开发和产品环境下,Puma是一个简单,快速,多线程,并高并发highly concurrent HTTP1.1server for Ruby ...
- akka框架——异步非阻塞高并发处理框架
akka actor, akka cluster akka是一系列框架,包括akka-actor, akka-remote, akka-cluster, akka-stream等,分别具有高并发处理模 ...
- java并发编程笔记(十一)——高并发处理思路和手段
java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) ...
- 互联网大厂高频重点面试题 (第2季)JUC多线程及高并发
本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识.斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季) ...
- Apache Tomcat如何高并发处理请求
介绍 作为常用的http协议服务器,tomcat应用非常广泛.tomcat也是遵循Servelt协议的,Servelt协议可以让服务器与真实服务逻辑代码进行解耦.各自只需要关注Servlet协议即可. ...
- 多线程与高并发(一)—— 自顶向下理解Synchronized实现原理
一. 什么是锁? 在多线程中,多个线程同时对某一个资源进行访问,容易出现数据不一致问题,为保证并发安全,通常会采取线程互斥的手段对线程进行访问限制,这个互斥的手段就可以称为锁.锁的本质是状态+指针,当 ...
- System.Speech.Synthesis 添加暂停、继续功能
为了方便调用暂停.继续的方法.要将speech的功能写成一个类.直接附上代码: using System; using System.Collections.Generic; using System ...
- 控制 MediaElement(播放、暂停、停止、音量和速度)
控制 MediaElement(播放.暂停.停止.音量和速度) WPF中对于多媒体的支持非常完整,一般都是通过MediaElement来实现的. http://msdn.microsoft.com/z ...
- js-音乐播放器,播放|暂停|滑块的功能
音乐播放器,播放|暂停|滑块的功能 document.addEventListener('DOMContentLoaded', function loaded(event) { var audio = ...
随机推荐
- 欧拉法求解常微分方程(c++)
#include<iostream> #include<iomanip> using namespace std; int main() { double x, y, h; ...
- list删除、集合遍历删除
public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<>(); li ...
- java定时任务框架Quartz入门与Demo搭建
- 使用Sabaki和Leela Zero配置AI围棋对弈环境
求 李昌镐儿童围棋课堂 的pdf. 一.下载Sabaki和Leela Zero最新版本 二.安装Sabaki 三.安装leela zero 四.Sabaki配置leela zero引擎 五.Sabak ...
- Spark程序打包
背景: spark程序,使用scala语言开发.整个项目中包含多个子模块,依赖包文件使用maven来管理. 打包: 方法一:使用artifacts来 选择模块,选择对应的主函数: 点ok保存. 由于s ...
- Eclipse检出原MyEclipse项目后 javax.servlet.http相关类都报错【我,体现着一类jar包问题的处理方法】
用Eclipse检出原来为myEclipse搭建的一个项目,检出后,所有关于httpservlet的类都报异常,说有没实现的方法? 但这个项目之前人家用MyEclipse运行都是没有问题的, 按住CT ...
- 【KakaJSON手册】08_其他用法
除了完成JSON和Model的转换之外,KakaJSON内部还有很多实用的功能,有些也开放为public接口了 遍历属性 struct Cat { var age: Int = 0 let name: ...
- React.lazy和React.Suspense异步加载组件
在React16.6中引入了React.lazy和React.Suspense,这两个组件,可以用来实现异步加载组件. 例如: const johanComponent = React.lazy(() ...
- PMP 第7章错题总结
这一章全是公式,是计算量最大的一章 1.进度安排的灵活性是由总时差决定的2.三点估算通过考虑估算中的不确定性和风险,可以提高活动持续时间估算的准确性3.快速跟进是一种进度压缩技术,将正常情况下按顺序进 ...
- EasyNVR网页摄像机无插件H5、谷歌Chrome直播方案安装使用常见问题的分析
EasyNVR对于互联网的视频直播还是有着一定的贡献的.为了方便用户的体验使用,我们也在互联网上放置了对应的试用版本,并且也会随着功能是更新也会定期的更新上去.软件包也会配置对应的使用文档和说明. 许 ...