最新要闻
- 世界要闻:苹果WWDC来了!iOS 17有三大变化
- 新消息丨葡萄健康栽培与病虫害防控(关于葡萄健康栽培与病虫害防控的简介)
- 每日快看:318川藏线巨石滚落砸烂一轿车:车内人员躲过一劫
- 荣耀90 Pro真机曝光:“星钻银”配色耀眼 灵感来自珠宝王冠-环球快看点
- 马斯克称特斯拉电动皮卡将在今年开始交付 不打算卸任CEO-最新资讯
- 比用毛巾还便宜 不怕有味儿:大牌洗脸巾7.9元100抽狂促
- 美国教授用ChatGPT判定学生论文抄袭:结果尴尬!聪明反被聪明误|今日热门
- 天天快资讯:时隔3年再“发车”,“北斗专列”如何升级?
- 概念动态|机器人新增“比亚迪概念”
- 世界球精选!你会买吗?澳航推“邻座无人”服务 最低仅140元
- 十年果粉换OPPO Find X6 Pro后直呼惊艳:果断把iPhone 14 Pro挂闲鱼卖掉|世界聚看点
- 视讯!拳头性别歧视案尘埃落定 将赔偿每位女性最多15万刀
- 男子为稳坐榜一大哥骗取乙方百万:全部打赏给女主播 被判刑
- 世界报道:巴西貘被饲养员挠痒一脸舒适 网友:长得东拼西凑但依然很萌
- 上海市首届中青年工程师创新创业大赛启动
- 小米发布米家空调巨省电2匹:新一级能效 一年省380度电
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
自定义一个简单的Task调度器、任务循环调度器、TaskScheduler
前言:
自从接触异步(async await Task)操作后,始终都不明白,这个Task调度的问题。
接触Quartz.net已经很久了,只知道它实现了一套Task调度的方法,自己跟着Quartz.net源代码写了遍,调试后我算是明白了Task调度的一部分事()。
(资料图片)
春风来不远,只在屋东头。
理解Task运行,请参考大佬文章 https://www.cnblogs.com/artech/p/task_scheduling.html ,推荐大佬的书。
直到我看Quartz.net源代码中的任务调度 “QueuedTaskScheduler”,我才搞明白了,如何写一个简单的任务调度器,或者说线程如何执行代码,才不会造成死循环,CPU吃满等问题,下面代码有的直接从quartz.net copy过来的。
BlockingCollection类
微软文档 https://learn.microsoft.com/zh-cn/dotnet/standard/collections/thread-safe/blockingcollection-overview
个人博客,中文解释通俗易懂 https://www.cnblogs.com/gl1573/p/14595985.html
BlockingCollection 提供一个很重要的“阻塞”功能。
TaskScheduler类
TaskScheduler 直译过来:表示一个对象,该对象处理将任务排队到线程上的低级工作。
该类为抽象类,其真正意义在于“对Task任务的编排”
基于TaskScheduler类实现自定义的“Task队列调度器”
源代码,我的仓库 https://github.com/qiqiqiyaya/Learning-Case/tree/main/TaskScheduler/AspNet6TaskScheduler
1.定义一个存储Task的队列容器,使用BlockingCollection容器来添加Task,为什么使用BlockingCollection,后面会解释
/// The collection of tasks to be executed on our custom threads. private readonly BlockingCollection _blockingTaskQueue;
2.定义CancellationTokenSource变量,用于释放。通常就是调用 CancellationToken.ThrowIfCancellationRequested() ,抛出一个 “OperationCanceledException”的异常,使正在执行的Task任务停止。
3.创建Thread数组,用于存储创建出的Thread
/// The threads used by the scheduler to process work. private readonly Thread[] _threads;
4.自定义一个类QueuedTaskScheduler,继承 “TaskScheduler”,“IDisposable”
public class QueuedTaskScheduler: System.Threading.Tasks.TaskScheduler, IDisposable
实现构造函数
public QueuedTaskScheduler(int threadCount) { _threadCount = threadCount; _blockingTaskQueue = new BlockingCollection(); // create threads _threads = new Thread[threadCount]; for (int i = 0; i < threadCount; i++) { _threads[i] = new Thread(ThreadBasedDispatchLoop) { Priority = ThreadPriority.Normal, IsBackground = true, Name = $"threadName ({i})" }; } // start foreach (var thread in _threads) { thread.Start(); } }
在构造函数中创建,并启动“Thread”,构造函数接收一个“线程数量的参数”,控制开启的线程数。
Thread中实现的委托为“ThreadBasedDispatchLoop”,其表达意思是“基于循环的调度”。
5.重点来了,具体看下“ThreadBasedDispatchLoop”方法的实现
ThreadBasedDispatchLoop实现
/// The dispatch loop run by all threads in this scheduler. private void ThreadBasedDispatchLoop() { _taskProcessingThread.Value = true; try { // If a thread abort occurs, we"ll try to reset it and continue running. while (true) { try { // For each task queued to the scheduler, try to execute it. foreach (var task in _blockingTaskQueue.GetConsumingEnumerable(_disposeCancellation.Token)) { TryExecuteTask(task); } } catch (ThreadAbortException) { // If we received a thread abort, and that thread abort was due to shutting down // or unloading, let it pass through. Otherwise, reset the abort so we can // continue processing work items. if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) {#pragma warning disable SYSLIB0006 Thread.ResetAbort();#pragma warning restore SYSLIB0006 } } } } catch (OperationCanceledException) { // If the scheduler is disposed, the cancellation token will be set and // we"ll receive an OperationCanceledException. That OCE should not crash the process. } finally { _taskProcessingThread.Value = false; } }
在外层套一层try catch捕获 CancellationTokenSource 变量,取消操作(CancellationTokenSource.Cancel())产生的异常,并且忽略该异常。
其中使用while(true),无限循环执行,?????奇了怪了,为什么以前写代码时,while(true)写了,会直接把CPU吃满,程序搞奔溃呢????
关键点就在于
当_blockingTaskQueue.GetConsumingEnumerable(_disposeCancellation.Token)执行时,如果_blockingTaskQueue容器中没有元素时,执行就会被“阻塞”,这种阻塞不会造成或者造成很小的资源浪费。
当_blockingTaskQueue有值时,阻塞就会停止,_blockingTaskQueue.GetConsumingEnumerable(_disposeCancellation.Token)执行,返回一个Task对象,然后开始执行 TryExecuteTask(task) ,执行Task。
6.继承 “TaskScheduler”后需要实现的几个方法
GetScheduledTasks
protected override IEnumerable? GetScheduledTasks() { return _blockingTaskQueue.ToList(); }
GetScheduledTasks 返回需要被调度的 Tasks
QueueTask
protected override void QueueTask(Task task) { // QueuedTaskScheduler 释放时,禁止向队列中添加Task if (_disposeCancellation.IsCancellationRequested) { throw new ObjectDisposedException(GetType().Name); } _blockingTaskQueue.Add(task); }
QueueTask 将排队等候的Task加入到 “_blockingTaskQueue”队列变量中
TryExecuteTaskInline
protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued) { // If we"re already running tasks on this threads, enable inlining return _taskProcessingThread.Value && TryExecuteTask(task); }
意思是,参数task是否在此线程上运行,请查看ThreadBasedDispatchLoop方法。
“ThreadLocal
自此自定义“Task调度器”完成。
启动,运行QueuedTaskScheduler
1. 创建 QueuedTaskScheduler ,其中用于执行Task的线程数为 1
2.创建 Task ,并将其加入到指定的 Task调度器中。
3.调试一下
A. 创建QueuedTaskScheduler ,创建 线程 “Thread” ,并启动线程
B. 调试过程
当_blockingTaskQueue没有Task时,执行到_blockingTaskQueue.GetConsumingEnumerable(_disposeCancellation.Token) 就会阻塞。
自此 自定义TaskScheduler完成。
我的源代码 https://github.com/qiqiqiyaya/Learning-Case/tree/main/TaskScheduler/AspNet6TaskScheduler
关键词:
-
自定义一个简单的Task调度器、任务循环调度器、TaskScheduler
前言:自从接触异步(asyncawaitTask)操作后,始终都不明白,这个Task调度的问题。接触Quartz net已经很久
来源: 自定义一个简单的Task调度器、任务循环调度器、TaskScheduler
货币市场日报:5月17日
世界要闻:苹果WWDC来了!iOS 17有三大变化
新消息丨葡萄健康栽培与病虫害防控(关于葡萄健康栽培与病虫害防控的简介)
每日快看:318川藏线巨石滚落砸烂一轿车:车内人员躲过一劫
荣耀90 Pro真机曝光:“星钻银”配色耀眼 灵感来自珠宝王冠-环球快看点
马斯克称特斯拉电动皮卡将在今年开始交付 不打算卸任CEO-最新资讯
比用毛巾还便宜 不怕有味儿:大牌洗脸巾7.9元100抽狂促
美国教授用ChatGPT判定学生论文抄袭:结果尴尬!聪明反被聪明误|今日热门
天天快资讯:时隔3年再“发车”,“北斗专列”如何升级?
【Linux】详解Centos7的下载安装配置
焦点日报:【财经分析】多重因素影响REITs市场表现 短期调整无碍机构长期看多
概念动态|机器人新增“比亚迪概念”
世界球精选!你会买吗?澳航推“邻座无人”服务 最低仅140元
十年果粉换OPPO Find X6 Pro后直呼惊艳:果断把iPhone 14 Pro挂闲鱼卖掉|世界聚看点
视讯!拳头性别歧视案尘埃落定 将赔偿每位女性最多15万刀
男子为稳坐榜一大哥骗取乙方百万:全部打赏给女主播 被判刑
世界报道:巴西貘被饲养员挠痒一脸舒适 网友:长得东拼西凑但依然很萌
上海市首届中青年工程师创新创业大赛启动
债市日报:5月17日
每日机构分析:5月17日 环球焦点
小米发布米家空调巨省电2匹:新一级能效 一年省380度电
【天天速看料】孟羽童接私活被开除 专家称老板不能要求员工没副业
全球微头条丨PC已死?联想不同意!
重新打趴中国厂商 韩国不服输:显示面板要夺回第一|天天时快讯
最后的低价?2TB三星980 Pro最低959到手
斗罗大陆冰凤凰vs火凤凰(斗罗大陆冰蝶舞)
springCloud Alibaba服务的注册与发现之eureka客户端注册-每日快看
最佳软件测试基础入门教程3软件开发生命周期的测试
黄牛为什么能抢走“五月天”的门票?|当前速讯
天天关注:记录--vue3优雅的使用element-plus的dialog
上映首日!《速度与激情10》票房突破8000万-全球看点
消息称58同城开启大裁员:裁撤比例50%以上-全球快讯
过去一年 腾讯员工减少1万人 平均工资又涨了 世界热推荐
国产龙芯3B600八个大小核、自研GPU:性能媲美Zen2、10代酷睿-当前播报
世界微动态丨你看微信视频号么?腾讯:粉丝破万创作者是去年三倍
天天视点!欧洲“核联盟”为欧洲核能发展拟定“路线图”
软件测试精品书籍文档下载
热议:4大特性看Huawei Cloud EulerOS为开发者带来平滑迁移体验
设计软件的二次开发总结(表格)
环球热门:金智科技接待中泰证券等多家机构调研
【时快讯】乌兹别克斯坦官员:乌兹别克斯坦愿与中国展开全方位各领域合作
被要求停服!CyGames《赛马娘》遭专利起诉:国服B站代理-每日速讯
RTX 4060 Ti/RX 7600新卡同时来了!NVIDIA、AMD拼价格:玩家血赚|每日视点
资讯:3年10倍!插电车型翻倍式爆卖 比亚迪独占世界4成
比5G好用10倍!北京首个5.5G实验基站正式开通
开除软件部门全体高管后 要用华为车机软件?大众回应
国家一级保护动物黄嘴白鹭“组团”造访厦门|世界快消息
kasini3000新增:ansible like输出 观焦点
小程序安全架构分析
天天微头条丨Natasha相关辅助类 (六)
SpringBoot项目预加载数据——ApplicationRunner、CommandLineRunner、InitializingBean 、@PostCo
DQL语句(一) -----简单select查询
过氧化苯甲酸叔丁酯商品报价动态(2023-05-17)
收评:沪指跌0.21%量能创逾两月新低 军工板块表现活跃
春秋时期青铜器酷似5根天线路由器 用途至今成谜 环球热头条
今日国内油价迎年内最大降幅 下次调整或将持续下跌
世界快资讯丨4年磨一剑 华为麒麟A2芯片来了:消息称已具备量产能力
全球看热讯:不负等待 新款华为MateBook E 二合一笔记本或将开启移动生产力融合时代
奥迪前CEO承认“大众排放门”存欺诈 拿839万元换缓刑
海上航行26天,首单到货!以人民币结算
SRE Google 运维解密读书笔记一:SRE 方法论概述
Python从零到壹丨带你了解图像直方图理论知识和绘制实现
匠心精神--来看一个小迭代的代码实现
《塞尔达传说:王国之泪》卖爆背后是手游行业的悲哀-全球视讯
再见吧!特斯拉强制单踏板模式
全球今亮点!“感染”塞尔达病毒后 我每天只睡三小时
硬派越野车不适合城市?仰望U8云辇-P出手:三级可调、软硬随心
ChatGPT估值已上2000亿 创始人对钱没兴趣:收入只够交保险 当前速看
23中国中药SCP001今日发布发行公告|当前聚焦
全球头条:1美金等于多少人民币元(2023年5月17日)
国内又现被驱赶的5G基站:你敢建?我就敢拆!居民称辐射大有害健康|全球热点评
开除软件部门全体高管后 大众被曝要用华为车机软件|全球微资讯
1TB硬盘只要200元 三星等带头减产闪存 国产存储公司回应:好消息 天天短讯
全球观焦点:企业级项目模板的配置与集成(Vite + Vue3 + TypeScript)
智能家居生态迎来超强辅助 快资讯
当前要闻:沈阳金融商贸开发区聘请十余位顾问委员会特邀专家
四大运营商宣布:我国启动全球首个5G异网漫游试商用
国产武侠游戏巅峰 等了16年的《仙剑4重制版》悬了
OPPO Reno10系列正面颜王:对称双曲面、2.12mm窄下巴 世界快讯
前苹果工程师被指控盗窃自动驾驶技术 为中国汽车公司牟利
ZV-1继承者来了!索尼新款Vlog相机5月23日发布
我国成功发射第五十六颗北斗导航卫星 全球观点
数据结构-环球速递
【世界热闻】提高数据的安全性和可控性,数栈基于 Ranger 实现的 Spark SQL 权限控制实践之路
环球看点!Django authenticate() 函数查找不到与提交的用户名和密码匹配的用户,则会返回 None。
apb uart IP使用说明
微软反驳马斯克:我们并没有控制OpenAI
频繁翻车、流量不再 为何明星代言手机越来越少了?
环球要闻:20年来重大转变 马斯克将花钱为特斯拉打广告
边开边充!瑞典率先打造世界首条永久性充电公路 头条
病人被医生遗忘在磁共振舱近三小时 属重大医疗事故 科普:没辐射
全球新动态:【道德经】五十·出生入死
NineData:高效高质量的 Redis 可视化管理工具|今热点
如何在不改变图片分辨率的情况下增加图片的大小
今日讯!国家发展改革委与标普评级公司召开座谈会 开展我国主权信用评级复评工作
最新70城房价出炉,4月份郑州新房同比增长0.2%
孟羽童图文广告报价至少15万一条 网友称其已赚近300万-世界聚看点
屏幕良心了 Redmi Book 14用上2.8K 120Hz:告别万年FHD 60Hz 当前观察
自主品牌崛起 国人依然爆买BBA等豪华车 30万以上增速翻倍-全球视讯