c# 后台任务自动执行

ops/2024/12/21 13:25:35/

如果有些任务需要在后台自动执行,且时不时需要添加一个任务,且按照优先级顺序执行,那么可以参考本文的方法。

后台任务类

定义一个后台任务类BackgroundTaskThread,其中Start方法是用来启动任务的,循环查询是否有添加任务,外部一般就调用AppendTask来添加任务。循环任务发现任务有添加后,会自动执行。如果有多个任务,会按加入的顺序一个一个执行。

public class BackgroundTaskThread
{/// <summary>/// 任务列表/// </summary>private List<TaskItem> TaskItems = new List<TaskItem>();/// <summary>/// 等待时间/// </summary>public int MillSeconds = 1000;/// <summary>/// 自动重置/// </summary>public AutoResetEvent TaskSet = new AutoResetEvent(false);/// <summary>/// 任务取消标识/// </summary>public CancellationTokenSource Source { get; set; } = new CancellationTokenSource();/// <summary>/// 日志/// </summary>public ILog Log { get; set; }/// <summary>/// 线程数量/// </summary>public int ThreadNum { get; private set; }/// <summary>/// 任务线程/// </summary>public List<Task> TaskThreads = new List<Task>();/// <summary>/// 启动/// </summary>/// <param name="taskTimeSpan">任务扫描间隔</param>/// <param name="taskNum">任务数量</param>public void Start(int taskTimeSpan, int taskNum){ThreadNum = taskNum;for (int i = 0; i < taskNum; i++){MillSeconds = taskTimeSpan;Task task = new Task(BackgroundThread);task.Start();TaskThreads.Add(task);}}/// <summary>/// 后台任务/// </summary>private void BackgroundThread(){try{while (!Source.Token.IsCancellationRequested){var item = GetOrSetTaskItem(true, null);if(item == null){TaskSet.WaitOne(MillSeconds);}else{try{item.Task.Invoke(item.Param);}catch (Exception ex){Log.error("任务 : ", item.Name, " 异常停止.,..", ex);}}}}catch (Exception ex){Log.error("后台任务线程异常退出....", ex);}}/// <summary>/// 读取或者/// </summary>/// <param name="isGet">是否是获取</param>/// <param name="item">任务项</param>/// <returns></returns>protected TaskItem GetOrSetTaskItem(bool isGet, TaskItem item){lock (this){if (isGet){if (TaskItems.Count == 0)return null;item = TaskItems[0];TaskItems.RemoveAt(0);return item;}else{TaskItems.Add(item);return item;}}}/// <summary>/// 追加任务/// </summary>/// <param name="task"></param>/// <param name="param"></param>public void AppendTask(Action<object> task, object param){GetOrSetTaskItem(false, new TaskItem() { Task = task, Param = param });TaskSet.Set();}/// <summary>/// 释放/// </summary>public void Dispose(){if(TaskThreads.Count > 0)Source.Cancel();TaskItems.Clear();}
}

实际任务

public class DoSomethingTaskThread : BackgroundTaskThread
{public void AppendSomething(object data){AppendTask(DoSomething, data);}private void DoSomething(object data){//TODO}
}

外部调用

当然,最好把DoSomethingTaskThread这个子类做成单例,后面直接

//启动任务,同步的话线程数传1,异步的话线程数可以传多点
DoSomethingTaskThread.Start(1000,1);//添加任务
DoSomethingTaskThread.AppendSomething(new object());

http://www.ppmy.cn/ops/143765.html

相关文章

Spring Boot 技术详解:核心特性、运行方式与应用实践

1.为什么要用SpringBoot Spring Boot 是一个用于创建独立的、生产级别的基于 Spring 的应用程序的框架。它通过简化配置和依赖管理&#xff0c;使开发者能够快速上手并构建应用程序。以下是使用 Spring Boot 的一些主要原因&#xff1a; 自动配置&#xff1a;Spring Boot 会根…

数据挖掘与机器学习(part 9) 规则挖掘Rules Mining关联规则(Association Rules) Apriori算法

基于规则的分类器&#xff1a;Classification using rule based classifier 互斥规则&#xff08;Mutually exclusive rules&#xff09;&#xff1a; 分类器包含互斥规则&#xff0c;如果这些规则彼此独立。 每条记录最多被一条规则覆盖。 穷尽规则&#xff08;Exhaustive …

第一章 操作系统引论

本文总结了操作系统第一章的重点知识&#xff0c;非常时候预习和复习的小伙伴们。大家可以根据目录先考考自己能回忆起多少知识&#xff01; 目录 1、 理解操作系统的目标、作用和定义 2、 脱机 I/O 方式 3、 多道程序设计的概念及引入的原因 4、 多道批处理系统的优缺点 …

barin.js(十四)GRU实战教程 - 文本情感分析之有害内容检测

系列文章&#xff1a; &#xff08;一&#xff09;&#xff1a;brain.js概要介绍&#xff08;二&#xff09;&#xff1a;项目集成方式&#xff08;三&#xff09;&#xff1a;手把手教你配置和训练神经网络&#xff08;四&#xff09;&#xff1a;利用异步训练和交叉验证来优…

uniapp小程序抽奖怎么做?直接使用【almost-lottery转盘组件】或者【自定义宫格转盘】

直接使用almost-lottery 地址&#xff1a;GitHub - ialmost/almost-components_uniapp: uni-app 使用的多端组件集合&#xff0c;支持APP、H5、小程序uni-app 使用的多端组件集合&#xff0c;支持APP、H5、小程序. Contribute to ialmost/almost-components_uniapp developmen…

图书馆管理系统(四)基于jquery、ajax--完结篇

任务3.6 后端代码编写 任务描述 这个部分主要想实现图书馆管理系统的后端&#xff0c;使用 Express 框架来处理 HTTP 请求&#xff0c;并将书籍数据存储在一个文本文件 books.txt 中。 任务实施 3.6.1 引入模块及创建 Express 应用 const express require(express); cons…

同源策略:为什么XMLHttpRequest不能跨域请求资源?

一.浏览器安全 浏览器安全可以分为三大块——Web页面安全、浏览器网络安全****和浏览器系统安全 假设&#xff0c;如果页面中没有安全策略的话&#xff0c;Web世界会是什么样子的呢&#xff1f; Web世界会是开放的&#xff0c;任何资源都可以接入其中&#xff0c;我们的网站可…

Docker镜像制作

目录 1. 镜像制作的原因和方式2. 快照方式制作镜像2.1 docker commit命令来制作镜像2.2 实战C HelloWorld 镜像制作 3. Dockerfile 制作镜像3.1 Dockerfile 是什么3.2 为什么需要 Dockerfile3.3 Dockerfile 指令3.3.1 指令清单3.3.2 FROM指令3.3.3 MAINTAINER指令3.3.4 LABEL指…