浅谈C#之任务调度TaskScheduler

news/2024/9/19 18:36:43/ 标签: c#, 开发语言

一、基本介绍

   TaskScheduler 是一个抽象类,用于控制任务的执行方式,特别是它们如何被安排到线程池中的线程上执行。

   TaskScheduler 负责将 Task 对象排队并决定何时、以何种方式执行这些任务。

二、TaskScheduler的作用

调度任务:将任务分配给线程池中的线程执行。

控制并发:通过限制同时执行的任务数量来控制并发级别。

异常处理:虽然不是直接由 TaskScheduler 处理异常,但它通过控制任务的执行环境间接影响了异常的处理方式。

三、TaskScheduler的关键点

默认调度器:大多数情况下,任务默认在 TaskScheduler.Default 调度器上运行,它通常与线程池中的线程关联。

自定义调度器:你可以创建自定义的 TaskScheduler 来控制任务的执行方式,例如,限制任务并发数或在特定的线程上运行任务。

任务调度:你可以使用 TaskScheduler 来调度任务的执行,例如,使用 Task.Run 方法时可以指定调度器。

同步上下文:在 UI 应用程序中,TaskScheduler 通常与 SynchronizationContext 一起使用,以确保任务在正确的线程上执行,例如在 UI 线程上更新 UI 元素。

任务调度器的层次结构TaskScheduler 可以有一个或多个父调度器,这允许你创建复杂的任务调度层次结构。

四、TaskScheduler的简单例子

using System;
using System.Threading.Tasks;class Program
{static void Main(){// 获取默认的任务调度器TaskScheduler defaultScheduler = TaskScheduler.Default;// 创建一个任务Task myTask = new Task(() =>{Console.WriteLine("Task is running on: " + TaskScheduler.Current.ToString());});// 在默认调度器上运行任务myTask.Start(defaultScheduler);// 等待任务完成myTask.Wait();}
}

五、TaskScheduler的完整例子

步骤 1: 创建自定义 TaskScheduler 类

首先,我们需要创建一个继承自 TaskScheduler 的类,并实现必要的方法。

using System;
using System.Collections.Concurrent;
using System.Threading;
using System.Threading.Tasks;public class LimitedConcurrencyLevelTaskScheduler : TaskScheduler
{private readonly int _maxDegreeOfParallelism;private readonly ConcurrentQueue<Task> _tasks = new ConcurrentQueue<Task>();private readonly CancellationTokenSource _cts = new CancellationTokenSource();private readonly object _lockObject = new object();private int _currentActiveTasks;public LimitedConcurrencyLevelTaskScheduler(int maxDegreeOfParallelism){if (maxDegreeOfParallelism <= 0) throw new ArgumentOutOfRangeException("maxDegreeOfParallelism");_maxDegreeOfParallelism = maxDegreeOfParallelism;}protected override void QueueTask(Task task){_tasks.Enqueue(task);}protected override bool TryExecuteTaskInline(Task task, bool taskWasPreviouslyQueued){return false;}protected override IEnumerable<Task> GetScheduledTasks(){return _tasks;}public void Start(){for (int i = 0; i < _maxDegreeOfParallelism; i++){Thread thread = new Thread(() =>{try{while (!_tasks.IsEmpty || !_cts.Token.IsCancellationRequested){Task task;if (_tasks.TryDequeue(out task)){base.TryExecuteTask(task);}else{Thread.Yield();}}}catch (Exception ex){Console.WriteLine("Thread encountered an exception: " + ex.Message);}});thread.IsBackground = true;thread.Start();}}public void Stop(){_cts.Cancel();}
}

步骤 2: 使用自定义 TaskScheduler

现在我们可以使用这个自定义的 TaskScheduler 来调度任务。

class Program
{static void Main(string[] args){LimitedConcurrencyLevelTaskScheduler scheduler = new LimitedConcurrencyLevelTaskScheduler(2);scheduler.Start();for (int i = 0; i < 10; i++){Task.Run(() => DoWork(i), scheduler);}Console.WriteLine("Press any key to exit...");Console.ReadKey();scheduler.Stop();}static void DoWork(int workItemId){Console.WriteLine($"Work item {workItemId} is running on thread {Thread.CurrentThread.ManagedThreadId}");Thread.Sleep(1000); // Simulate work by sleeping}
}

解释

LimitedConcurrencyLevelTaskScheduler:这是一个自定义的 TaskScheduler,它接受一个参数 maxDegreeOfParallelism,这定义了同时运行的最大任务数。

QueueTask:这个方法将任务添加到一个线程安全的队列中。

TryExecuteTaskInline:这个方法始终返回 false,因为我们不在调用线程上直接执行任务。

GetScheduledTasks:返回当前队列中的任务。

Start:启动指定数量的线程来处理队列中的任务。

Stop:停止所有线程并取消所有任务。


http://www.ppmy.cn/news/1524140.html

相关文章

【网络安全】密码学概述

1. 密码学概述 1.1 定义与目的 密码学是一门研究信息加密和解密技术的科学&#xff0c;其核心目的是确保信息在传输和存储过程中的安全性。密码学通过加密算法将原始信息&#xff08;明文&#xff09;转换成难以解读的形式&#xff08;密文&#xff09;&#xff0c;只有拥有正…

MQ-2烟雾传感器详解(STM32)

目录 一、介绍 二、传感器原理 1.原理图 2.引脚描述 3.工作原理介绍 三、程序设计 main.c文件 mq2.h文件 mq2.c文件 四、实验效果 五、资料获取 项目分享 一、介绍 MQ-2气体传感器是一种常用的气体传感器&#xff0c;用于检测空气中的烟雾浓度。工作原理是基于半导…

设计模式-行为型模式-状态模式

1.状态模式的定义 允许一个对象在其内部状态改变时改变他的行为&#xff0c;用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题&#xff0c;状态模式将一个对象的状态从该对象中分离出来&#xff0c;封装到专门的状态类中&#xff0c;使得对象的状态可以灵活变化&…

计算987654321*123456789

#include <stdio.h>int main() {int a[9] {9,8,7,6,5,4,3,2,1};int b[9] {1,2,3,4,5,6,7,8,9};int c[20] {0};//定义第三个数组装乘积值int flag 0;//定义一个标志位int count 0;//定义一个进位//先进位再相加for(int i 0;i < 9;i)//遍历数组a的每一位{for(int …

AI学习者的Python快速入门指南

Python 已成为 AI 和数据科学的事实标准编程语言。尽管存在无需编码的解决方案&#xff0c;但学习编程仍然是构建完全定制化 AI 项目或产品的必要途径。在本文中&#xff0c;我将分享一个 Python 入门快速指南&#xff0c;帮助初学者进行 AI 开发。我会先介绍基础知识&#xff…

2024数学建模国赛A题详细思路:基于空间几何运动学和优化模型matlab求解

2024数学建模国赛A题“板凳龙”闹元宵 2024高教社杯数学建模竞赛A题B题C题D题E题完整成品文章和全部问题的解题代码完整版本更新如下&#xff1a;https://www.yuque.com/u42168770/qv6z0d/rytbc1nelty1mu4o % 定义常量 L_head 3.41; % 龙头长度&#xff08;米&#xff09; L…

RS®FSWP 相位噪声分析仪和 VCO 测试仪信号源和组件的高端分析

FSWP 相位噪声分析仪和VCO测试仪 价格实惠&#xff0c;性能出众 R&SFSWP 相位噪声分析仪和 VCO 测试仪结合噪声极低的内部源与互相关技术&#xff0c;具备高灵敏度。它可在数秒内测量高度稳定的信号源的相位噪声。 R&SFSWP 还具备脉冲信号测量、加性相位噪声&…

【数据结构-二维前缀和】力扣221. 最大正方形

在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内&#xff0c;找到只包含 ‘1’ 的最大正方形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”…

Eprime学习【E-basic语言、心理学实验程序设计】

文章目录 Eprime学习心理学实验程序设计的基本框架一、实验设计的基本原则二、实验过程&#xff08;procedure&#xff09;与实验列表&#xff08;list&#xff09;三、心理学实验设计的基本模式四、心理学常用的功能与制作 E-basic语言 Eprime学习 心理学实验程序设计的基本框…

年化12.6%,最大回撤才2.6的债券​轮动策略,卡玛比4.79,稳稳的幸福

原创内容第647篇&#xff0c;专注量化投资、个人成长与财富自由。 昨天复盘星球工作&#xff0c;深刻感受一个词的重要性&#xff1a;专注。 一人企业&#xff0c;也是企业运作的逻辑。只是成本降到最低。要专注。 企业本身也要专注&#xff0c;有所不为&#xff0c;有所必为…

编写Dockerfile第二版

目标 更快的构建速度 更小的Docker镜像大小 更少的Docker镜像层 充分利用镜像缓存 增加Dockerfile可读性 让Docker容器使用起来更简单 总结 编写.dockerignore文件 容器只运行单个应用 将多个RUN指令合并为一个 基础镜像的标签不要用latest 每个RUN指令后删除多余文…

56 - I. 数组中数字出现的次数

comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9856%20-%20I.%20%E6%95%B0%E7%BB%84%E4%B8%AD%E6%95%B0%E5%AD%97%E5%87%BA%E7%8E%B0%E7%9A%84%E6%AC%A1%E6%95%B0/README.md 面试题 56 - I. 数组中数…

搜维尔科技:ART光学空间定位虚拟交互工业级光学跟踪系统

ART光学空间定位虚拟交互工业级光学跟踪系统 搜维尔科技&#xff1a;ART光学空间定位虚拟交互工业级光学跟踪系统

Facebook如何通过AI改变你的社交体验?

在当今数字化的社交媒体环境中&#xff0c;Facebook作为全球最大的社交平台之一&#xff0c;正在通过引入和优化人工智能&#xff08;AI&#xff09;技术&#xff0c;改变用户的社交体验。人工智能不仅帮助Facebook增强了内容推荐和信息过滤的精准度&#xff0c;还让平台具备了…

STM32F1 HAL库笔记1_HAL 驱动程序概述(2)

1、LL驱动程序概述 LL驱动程序旨在提供快速、轻量级、面向专家的层&#xff0c;它比 HAL 更接近硬件。与 HAL 相反&#xff0c;LL API 不适用于以下外设&#xff1a;不需要代码优化的外设&#xff0c;软件配置复杂的外设&#xff0c;复杂的上层堆栈&#xff08;如 USB&…

第146天:内网安全-Web权限维持各语言内存马Servlet-api类Spring类Agent类

目录 前置知识及资源 案例一&#xff1a; 权限维持-Web-内存马-PHP 案例二&#xff1a; 权限维持-Web-内存马-Python 案例三&#xff1a; 权限维持-Web-内存马-JAVA 案例四&#xff1a; 权限维持-Web-内存马-哥斯拉&冰蝎 哥斯拉 ​编辑 冰蝎 前置知识及资源 什么是…

Lvgl8.3 自定义矩形按键的标签,图标 lv_btnmatrix

效果图 主要实现自定义标签/图标,位置,字体可以随意修改 /*** brief 事件回调函数** param e*/ static void event_cb(lv_event_t *e) {lv_event_code_t code lv_event_get_code(e);lv_obj_t *obj lv_event_get_target(e);// 按键点击事件if (code LV_EVENT_VALUE_CHANGED…

计算机网络 第三章: 差错检测

文章目录 1. 误码的相关概念2. 奇偶校验2.1 定义2.2 奇偶校验在实践中的应用 3. 循环冗余校验3.1 循环冗余校验CRC的基本思想3.2 发送方CRC操作3.3 接受方CRC操作 4. 习题5. 解答 1. 误码的相关概念 实际的通信链路都不是理想的&#xff0c;比特在传输过程中可能会产生差错&am…

一句话描述设计模式

最近在看设计模式&#xff0c;其描述抽象程度令人欲罢不能&#xff0c;始终不得其意。于是尝试用一句话总结了一下&#xff0c;常规的就不说了&#xff0c;只是举了个例子。 单例模式 Spring中的单例bean使用了双重锁机制 工厂模式 Spring中的BeanFactory是简单工厂模式Bea…

vscode ros代码调试

vscode默认已经安装好。 1. 编译工程 编译选项为Debug&#xff0c;如果原始CMakeList.txt中有set(CMAKE_BUILD_TYPE Release)&#xff0c;要注释掉。 cd catkin_wscatkin_make -DCMAKE_BUILD_TYPEDebug 2. 进入工作空间 3. 下载ROS插件 4. debug文件自动配置&#xff08;la…