当前位置: 首页 > news >正文

c# TaskScheduler

这里记录下 TaskScheduler 的简单用法。

使用场景:

使用 Task 的时候,大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个,那么这3个 Task 就各自放飞直接运行了。

class Program
{private static TaskFactory _taskFactory;static void Main(string[] args){_taskFactory = new TaskFactory();_taskFactory.StartNew(Func1);_taskFactory.StartNew(Func2);_taskFactory.StartNew(Func3);Console.ReadLine();}static void Func1(){Thread.Sleep(3000);Console.WriteLine("Func1");}static void Func2(){Thread.Sleep(2000);Console.WriteLine("Func2");}static void Func3(){Thread.Sleep(1000);Console.WriteLine("Func3");}
}

结果:
Func3
Func2
Func1

一般情况下没什么大问题,但如果这3个中的每个Task都非常耗CPU或者内存,而计算机又需要预留资源去干别的事情,这就要让3个Task不能同时执行。又或者确实要让某些Task先做,有些后做。这就需要我们自己能够决定Task执行顺序。

怎样达到这样的效果?

答案就是:TaskScheduler,它可以让已经创建好的 Task 去按照特殊的顺序来执行。

就拿上面的场景来举例:
为了节约系统资源,我要让这3个Task单独执行,有一个在执行,其它俩就不能执行。最简单的就是串行执行,这样只需要写一个类继承TaskScheduler:

public class MyTaskScheduler : TaskScheduler, IDisposable
{private static readonly object _mutex = new object();public readonly List<Task> _currentTasks = new List<Task>();private readonly ManualResetEvent[] _schedulerEvents = new ManualResetEvent[2];public override int MaximumConcurrencyLevel => 1;public MyTaskScheduler(){_schedulerEvents[0] = new ManualResetEvent(false);_schedulerEvents[1] = new ManualResetEvent(false);var executionThread = new Thread(ExecutionThread) { Name = "MyThread" };executionThread.SetApartmentState(ApartmentState.MTA);executionThread.IsBackground = true;executionThread.Priority = ThreadPriority.Normal;executionThread.Start(null);}public void Dispose(){_schedulerEvents[1].Set();}private void ExecutionThread(object args){try{while (true){if (!WaitIfEmpty()){break;}Task task;lock (_mutex){task = _currentTasks[0];}try{TryExecuteTask(task);}catch (Exception){throw;}finally{TryDequeue(task);}}}finally{//todo}}private bool WaitIfEmpty(){lock (_mutex){if (_currentTasks.Count == 0){//pause task_schedulerEvents[0].Reset();}}//wait any signal.int id = WaitHandle.WaitAny(_schedulerEvents);// id is item index of _schedulerEventsreturn id == 0;}protected override IEnumerable<Task>? GetScheduledTasks(){lock (_mutex){return _currentTasks.ToArray();}}protected override void QueueTask(Task task){lock (_mutex){_currentTasks.Add(task);if (_currentTasks.Count > 0){// Start task_schedulerEvents[0].Set();}}}protected sealed override bool TryDequeue(Task task){lock (_mutex){var res = _currentTasks.Remove(task);return res;}}protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued){return false;}
}

运行结果:
Func1
Func2
Func3

在MyTaskScheduler 中,我建了一个线程 executionThread,线程方法是一个while循环,一直在监听有没有新的Task过来,有多个Task过来,就按Task创建顺序执行,没有的话 while 就暂停在 waitany 处。

这样的场景,配合 ManualResetEvent 和Task的CancellationTokenSource 非常适合做 带有暂停和取消功能的任务列表。

相关文章:

c# TaskScheduler

这里记录下 TaskScheduler 的简单用法。 使用场景&#xff1a; 使用 Task 的时候&#xff0c;大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个&#xff0c;那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...

可视化数据

数据科学家会直观呈现数据&#xff0c;以更好地理解数据。 他们可以扫描原始数据、检查摘要度量值&#xff08;如平均值&#xff09;或绘制数据图表。 图表是一种可视化数据的强有力方式&#xff0c;数据科学家经常使用图表快速了解适度复杂的模式。 直观地表示数据 绘制图表…...

【Redis】Redis缓存击穿

1. 概述 缓存击穿&#xff1a;缓存击穿问题也叫热点key问题&#xff0c;一个高并发的key或重建缓存耗时长&#xff08;复杂&#xff09;的key失效了&#xff0c;此时大量的请求给数据库造成巨大的压力。如下图&#xff0c;线程1还在构建缓存时&#xff0c;线程2&#xff0c;3&…...

厦门凯酷全科技有限公司深耕抖音电商运营

在数字经济飞速发展的今天&#xff0c;抖音电商平台以其独特的社交属性和庞大的用户基础&#xff0c;迅速成为众多品牌和商家的新战场。在这个充满机遇与挑战的市场中&#xff0c;厦门凯酷全科技有限公司凭借其专业的服务、创新的理念和卓越的执行力&#xff0c;成为了抖音电商…...

六西格玛DMAIC在企业得项目管理中有什么作用

六西格玛&#xff08;Six Sigma&#xff09;是一种以数据为基础的管理方法&#xff0c;旨在通过减少缺陷和变异来提高过程质量和效率。DMAIC 是六西格玛中一种常用的改进方法论&#xff0c;适用于现有过程的改进。DMAIC 代表五个阶段&#xff1a;定义&#xff08;Define&#x…...

vscode借助插件调试OpenFoam的正确的.vscode配置文件

正确的备份文件位置&#xff1a; /home/jie/桌面/理解openfoam/正确的调试爆轰单进程案例/mydebugblastFoam 调试爆轰案例流体 并且工作区和用户区都是openfoam-7版本 问题&#xff1a;F5以debug模式启动后不停在断点 解决方法&#xff1a; 这里备份一下.vsode正确的配置&…...

SpringBoot整合JWT(JSON Web Token)生成token与验证

目录 JWT 什么是JWT JWT使用流程 确定要传递的信息: 生成JWT: JWT传输: 客户端保存JWT: 客户端发送JWT: 服务器验证JWT: 服务器响应: Token的使用示例: 工具类 R结果集 返回一个生成的token 创建拦截器 JWT 什么是JWT JWT(JSON Web Token)是是目前最…...

把帕拉丁需要的.rom文件转成.bin

# 输入文件名 input_file_name = fw_payload.bin.rom # 输出文件名 output_file_name = fw_payload.bin.rom2 # 打开输出文件,准备写入翻转后的十六进制字符串 with open(output_file_name, w) as output_file: # 打开输入文件读取十六进制字符串 with open(input_f…...

Nginx 缓存那些事儿:原理、配置和最佳实践

Nginx 缓存那些事儿&#xff1a;原理、配置和最佳实践 在当今的互联网世界&#xff0c;网站的访问量和数据处理量不断攀升&#xff0c;如何确保用户能够快速、稳定地访问我们的网站&#xff0c;已经成为每个运维工程师面临的挑战。幸运的是&#xff0c;Nginx 作为一款高性能的…...

vue发展史

Vue.js发展史 Vue.js是一个渐进式JavaScript框架&#xff0c;自发布以来受到了广泛的关注和喜爱。以下是Vue.js的发展史&#xff1a; 1. 起源&#xff08;2013年&#xff09; Vue.js的创始人尤雨溪&#xff08;Evan You&#xff09;在2013年开始构思这个项目。当时&#xff0…...

基于Java和Vue开发的校园跑腿软件校园跑腿小程序系统源码

市场前景 学生需求多样化&#xff1a; 随着校园生活节奏的加快和学生需求的多样化&#xff0c;跑腿服务逐渐成为一种新兴的商业模式。学生群体对于便捷、高效的日常服务需求不断增加&#xff0c;如外卖送餐、快递代取、文件传递等。市场规模持续增长&#xff1a; 大学校园作为…...

MySQL(五)--- 事务

1、CURD操作不加控制时,可能会出现什么问题 即:类似于线程安全问题,可能会导致数据不一致问题。 因为,MySQL内部本身就是多线程服务。 1.1、CURD满足什么属性时,才能避免上述问题 1、买票的过程得是原子的吧。 2、买票互相应该不能影响吧。 3、买完票应该要永久有效吧。…...

llm chat场景下的数据同步

背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在&#xff0c;数据同步&#xff08;想起来&#xff09;相对简单。而llm的chat在缺失这两个机制的情况下&#xff0c;没见到特别好的做到了数据同步的产品。 llm chat主要两…...

机器学习经典算法

机器学习经典算法学习和分享。 k近邻算法 线性回归 梯度下降法 PCA主成分分析法 多项式回归 逻辑回归 支撑向量机SVM 决策树 随机森林 评价分类指标...

Scala中的泛型

类型参数 ---- 泛型(数据类型是变化的) (1) 可以有多个 (2) 名称合法就行&#xff0c;没有固定的&#xff0c;一般用T(Type) 在Scala中&#xff0c;用[]表示。在Java中用<>表示 1. 与数据类型的区别 List是数据类型&#xff0c;表示一个列表。[Int]表示泛型&#xff0c;它…...

数据分析特征标准化方法及其Python实现

数据分析特征标准化方法及其Python实现 1、概述 在数据分析中,对特征进行标准化主要是: 1、消除量纲影响 不同特征可能具有不同的量纲和数量级。 例如,一个特征可能是以米为单位的长度,而另一个特征可能是以秒为单位的时间。直接使用这些具有不同量纲的原始数据进行分析…...

UnityShaderLab 实现程序化形状(一)

1.实现一个长宽可变的矩形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形&#xff1a; 代码&#xff1a; fixed4 frag (v2f i) : SV_Target{return (distance(a…...

前端数据安全防护(控制台)

目录 前言 禁用右键菜单 禁用快捷键 监控控制台 完整逻辑 前言 前端的数据在浏览器中一直处于一个裸奔的状态&#xff0c;只要是稍微懂一点计算机的人&#xff0c;都可以在浏览器的控制台中拿到前端页面的所有数据&#xff0c;包括和后端的交互数据。为了…...

自己玩虚拟机:vagrant,virtual box,centos

vagrant 访问Vagrant官网 https://www.vagrantup.com/ 点击Download Windows&#xff0c;MacOS&#xff0c;Linux等 选择对应的版本 AMD64 (x86_64) I686 (x86) 傻瓜式安装 命令行输入vagrant&#xff0c;测试是否安装成功 vagrant -v 可以查看当前版本 virtual box 访…...

Frida框架HOOK RegisterNatives函数

使用Frida框架HOOK RegisterNatives函数&#xff0c;获取动态注册的函数地址、名称、签名、class名称、所属的so文件名称、so文件加载基址、函数在so文件中的地址。 废话不多说&#xff0c;上代码&#xff1a; 运行命令&#xff1a;frida -U -f in.****** -l RegisterNatives…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具

作者&#xff1a;来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗&#xff1f;了解下一期 Elasticsearch Engineer 培训的时间吧&#xff01; Elasticsearch 拥有众多新功能&#xff0c;助你为自己…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

Android15默认授权浮窗权限

我们经常有那种需求&#xff0c;客户需要定制的apk集成在ROM中&#xff0c;并且默认授予其【显示在其他应用的上层】权限&#xff0c;也就是我们常说的浮窗权限&#xff0c;那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

浅谈不同二分算法的查找情况

二分算法原理比较简单&#xff0c;但是实际的算法模板却有很多&#xff0c;这一切都源于二分查找问题中的复杂情况和二分算法的边界处理&#xff0c;以下是博主对一些二分算法查找的情况分析。 需要说明的是&#xff0c;以下二分算法都是基于有序序列为升序有序的情况&#xf…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...