--近期有一个需要运用多线程的项目,会有并发概率,所以写了一份代码,可能有写地方还不完善,后续有需求在改
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# 多线程与高并发处理并且具备暂停、继续、停止功能的更多相关文章

  1. puma(5300✨) Rails的一个多线程,高并发处理的web server

    https://github.com/puma/puma 在开发和产品环境下,Puma是一个简单,快速,多线程,并高并发highly concurrent HTTP1.1server for Ruby ...

  2. akka框架——异步非阻塞高并发处理框架

    akka actor, akka cluster akka是一系列框架,包括akka-actor, akka-remote, akka-cluster, akka-stream等,分别具有高并发处理模 ...

  3. java并发编程笔记(十一)——高并发处理思路和手段

    java并发编程笔记(十一)--高并发处理思路和手段 扩容 垂直扩容(纵向扩展):提高系统部件能力 水平扩容(横向扩容):增加更多系统成员来实现 缓存 缓存特征 命中率:命中数/(命中数+没有命中数) ...

  4. 互联网大厂高频重点面试题 (第2季)JUC多线程及高并发

    本期内容包括 JUC多线程并发.JVM和GC等目前大厂笔试中会考.面试中会问.工作中会用的高频难点知识.斩offer.拿高薪.跳槽神器,对标阿里P6的<尚硅谷_互联网大厂高频重点面试题(第2季) ...

  5. Apache Tomcat如何高并发处理请求

    介绍 作为常用的http协议服务器,tomcat应用非常广泛.tomcat也是遵循Servelt协议的,Servelt协议可以让服务器与真实服务逻辑代码进行解耦.各自只需要关注Servlet协议即可. ...

  6. 多线程与高并发(一)—— 自顶向下理解Synchronized实现原理

    一. 什么是锁? 在多线程中,多个线程同时对某一个资源进行访问,容易出现数据不一致问题,为保证并发安全,通常会采取线程互斥的手段对线程进行访问限制,这个互斥的手段就可以称为锁.锁的本质是状态+指针,当 ...

  7. System.Speech.Synthesis 添加暂停、继续功能

    为了方便调用暂停.继续的方法.要将speech的功能写成一个类.直接附上代码: using System; using System.Collections.Generic; using System ...

  8. 控制 MediaElement(播放、暂停、停止、音量和速度)

    控制 MediaElement(播放.暂停.停止.音量和速度) WPF中对于多媒体的支持非常完整,一般都是通过MediaElement来实现的. http://msdn.microsoft.com/z ...

  9. js-音乐播放器,播放|暂停|滑块的功能

    音乐播放器,播放|暂停|滑块的功能 document.addEventListener('DOMContentLoaded', function loaded(event) { var audio = ...

随机推荐

  1. 第01组 Alpha冲刺(2/6)

    队名:007 组长博客: https://www.cnblogs.com/Linrrui/p/11861798.html 作业博客: https://edu.cnblogs.com/campus/fz ...

  2. UDF——涡量

    用涡量的模来显示涡结构是一种很常用的方法 涡量: 针对二维,涡量场表示为如下的标量: 对于二维流动来说,涡量为正,表示逆时针旋转:涡量为负,表示顺时针旋转 三维涡量: 其中: 计算涡量的模: 二维涡量 ...

  3. 经典算法(三) 单链表 反转 & 是否相交/成环 & 求交点 等

    参考文章: 判断链表是否相交:http://treemanfm.iteye.com/blog/2044196 一.单链表反转 链表节点 public class Node { private int ...

  4. Linux 删除文件未释放空间问题处理,下清空或删除大文件

    linux里的文件被删除后,空间没有被释放是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么 ...

  5. 启用IIS Express SSL(Https)的注意事项

    2年前搞国外的信用卡支付对接,必须用SSL方式调用第三方支付公司的接口,本地调试需要启用IIS Express的SSl,最近又搞类似需要SSL的项目,忘记怎么设置的了,本以为直接将原来的http后面加 ...

  6. Re3 : Real-Time Recurrent Regression Networks for Visual Tracking of Generic Objects

    Re3 : Real-Time Recurrent Regression Networks for Visual Tracking of Generic Objects 2019-10-04 14:4 ...

  7. Kibana启动后外网访问不了

    问题 Kibana启动后,使用外网访问 http://ip地址:5601 访问不了日志中最后显示 "statusCode":302 ,在控制台 curl http://localh ...

  8. [python]pypy优化python性能

    下载地址:https://pypy.org/download.html # python2.7版本 yum install pypy # python3.6版本https://bitbucket.or ...

  9. 【PHP】php实现二进制、八进制、十进制、十六进制之间各自转换的函数

    <?php /* 常见的进制: 二进制 binary -----> bin 八进制 octal -----> oct 十进制 decimal -----> dec 十六进制 h ...

  10. IEEE-754格式标准,float,

    float float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有2部分组成:底数m和指数e 底数部分 使用二进制数来表示此浮点数的实际值指数部分 占用8bit的二进 ...