当前位置: 首页 > 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…...

[创业之路-189]:《华为战略管理法-DSTE实战体系》-2- 生存与发展的双重旋律:短期与长期、战术与战略的交响乐章

目录 生存与发展的双重旋律&#xff1a;短期与长期、战术与战略的交响乐章 一、生存&#xff1a;短期视角下的战术布局 二、发展&#xff1a;长期视角下的战略规划 三、短期与长期、战术与战略的融合与平衡 四、结语&#xff1a;在生存与发展的交响曲中奏响辉煌 生存与发展…...

TDengine 部署

TDengine是一款开源高性能的时序数据库&#xff0c;其部署过程可以根据不同的环境和需求进行灵活配置。以下将详细介绍TDengine的部署步骤&#xff0c;包括单节点部署和集群部署。 一、单节点部署 下载安装包&#xff1a; 访问TDengine的官方网站或GitHub仓库&#xff0c;下载…...

【前端】20种 Button 样式

20种 Button 样式 在前端开发中&#xff0c;Button 按钮的样式设计是提升用户交互体验的重要一环。以下是20种常见的Button样式&#xff0c;这些样式主要基于CSS实现&#xff0c;可以根据具体需求进行调整和组合。 1. 默认样式 CSS 样式&#xff1a;.button { background-co…...

机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法

引言 大模型&#xff08;如BERT、GPT等&#xff09;在自然语言处理任务中展现了强大的能力&#xff0c;但为了使其更贴合特定应用场景&#xff0c;通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据&#xff0c;并通过具体…...

mysql的执行计划分析和索引下推以及索引长度计算

1 执行计划介绍 执行计划&#xff08;Execution Plan&#xff09;是数据库查询优化的重要工具&#xff0c;用于展示数据库如何执行 SQL 查询的详细过程。它包含了查询操作的步骤、各个步骤的执行顺序、使用的索引、访问的表、连接方式、预计的成本等信息 可以显示SQL语句最终…...

C#中的string操作详解-截取、分割、连接、替换等

在C#中&#xff0c;string 类提供了许多用于操作字符串的方法&#xff0c;包括截取、分隔和连接等。以下是一些常用字符串操作的介绍和实例&#xff1a; 1. 截取字符串 Substring 方法 用于从字符串中截取子字符串。 语法&#xff1a; //从startIndex开始截取&#xff0c;…...

Redis Cluster 分片机制

Redis 集群是 Redis 提供的一种分布式实现&#xff0c;用于水平扩展数据存储能力。通过 Redis 集群&#xff0c;可以将数据分片存储在多个 Redis 节点上&#xff0c;同时提供高可用性和故障转移功能。 分片&#xff08;Sharding&#xff09;&#xff1a; Redis 集群将数据划分…...

论文结论:GPTs and Hallucination Why do large language models hallucinate

GPTs and Hallucination 当一个主题有普遍共识&#xff0c;并且有大量语言可用于训练模型时&#xff0c;大模型的输出可以反映出该共识观点在没有足够关于主题的语言示例【晦涩/数据有限】&#xff0c;或者主题有争议&#xff0c;或是对主题没有明确共识的情况下&#xff0c;就…...

CSS在线格式化 - 加菲工具

CSS在线格式化 打开网站 加菲工具 选择“CSS在线格式化” 或者直接访问 https://www.orcc.online/tools/css 输入CSS代码&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果...

组件通信(父传子,子传父,跨组件通信)

组件&#xff08;component&#xff09;是vue.js最核心的功能&#xff0c;是可扩展的HTML元素。每个页面都是一个HTML。以.vue结尾的文件&#xff0c;都可以叫组件。 场景&#xff1a;将一个完整的项目&#xff0c;拆分成不同的功能模块。 注意&#xff1a;组件首字母要大写。 …...

单位网站建设情况说明/链交换反应

为什么80%的码农都做不了架构师&#xff1f;>>> ##1. MVC MVC是一个设计模式&#xff0c;它强制性的使应用程序的 输入、处理和输出分开。 使用MVC应用程序被分成三个核心部件&#xff1a;模型&#xff08;M&#xff09;、视图&#xff08;V&#xff09;、控制器&a…...

长沙网络优化推广公司/长春seo主管

通过传统的form表单提交的方式上传文件&#xff1a; 123456789<form id "uploadForm" action "http://localhost:8080/cfJAX_RS/rest/file/upload" method "post" enctype "multipart/form-data"> <h1 >测试通过Rest接口上…...

公司推广网站怎么做/网络优化工程师

http://blog.csdn.net/leisure512/article/details/4881391 由于学习多线程编程&#xff0c;所以用到pthread&#xff0c;但是man的时候却发现没有pthread函数库的手册页&#xff0c;然后安装 $sudo apt-get install glibc-doc 安装以后&#xff0c;发现还是有很多函数不全&…...

wordpress自制主题/今晚赛事比分预测

大数据人才作为中国互联网行业需求最旺盛的六类人才之一&#xff0c;初级大数据工程师的薪水就达15k&#xff0c;有三年以上工作经验的资深工程师更是高达年薪50-60万。据麦肯锡报告&#xff0c;目前大数据人才缺口更是在百万人以上。如何实现大数据开发入门呢&#xff1f;如果…...

wordpress 获取logo/外贸接单平台

在面向对象开发时&#xff0c; 比如变量.name .如果这个变量为null&#xff0c;就是数据库里面传过来的值为null。 那么&#xff0c;就会报这个错误。 首先看到这个null 单词&#xff0c;. 通过EFcore读取数据&#xff0c; 变量.name ,或者变量.点其他内容。 如果报错了&…...

纺织面料做哪个网站好/谷歌浏览器网页

今天下午我们进行了java的上机考试&#xff0c;这科我花费大量时间在上面的科目&#xff0c;狠狠地打了我的脸。 考试进行的很不顺利。考试系统老师整了很长时间还没有弄好&#xff0c;起初她让我们等&#xff0c;等了很长时间&#xff0c;我在吵闹的机房里&#xff0c;更加深了…...