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

使用任务队列TaskQueue和线程池ThreadPool技术实现自定义定时任务框架详解

在这里插入图片描述

前言

在桌面软件开发中,定时任务是一个常见的需求,比如定时清理日志、发送提醒邮件或执行数据备份等操作。在C#中有一个非常著名的定时任务处理库Hangfire,不过在我们深入了解Hangfire 之前,我们可以手动开发一个定时任务案例,用以帮助我们理解Hangfire的核心原理。我们可以利用 任务队列(Task Queue)线程池(Thread Pool) 这两个核心概念,构建一个高效且具有良好扩展性的定时任务系统。本文将从零开始实现一个基于任务队列和线程池的定时任务框架,并结合实际应用场景进行详细解析。

一、实现思路

  1. 任务队列:存储待执行的任务,支持并发安全,并可以支持任务优先级。
  2. 线程池:预先分配一组线程,避免频繁创建和销毁线程,同时能够动态调整线程池的大小以应对不同负载。
  3. 定时调度器:定时检查任务队列,根据任务的执行时间将任务分发到线程池中执行,并支持任务执行状态管理。

二、实现步骤

1. 任务定义

首先,我们定义一个通用任务类,用于存储任务信息,扩展它以支持优先级和执行状态。

public enum TaskStatus
{Pending,Executing,Completed,Failed
}public class ScheduledTask
{public string TaskName { get; set; }public DateTime ExecutionTime { get; set; }public Action TaskAction { get; set; }public TaskStatus Status { get; set; }public int Priority { get; set; } // 优先级,值越小优先级越高public ScheduledTask(string taskName, DateTime executionTime, Action taskAction, int priority = 0){TaskName = taskName;ExecutionTime = executionTime;TaskAction = taskAction;Status = TaskStatus.Pending;Priority = priority;}
}

2. 任务队列

为了支持任务优先级,我们使用一个优先级队列来存储任务,并确保任务的安全性。可以借助 ConcurrentQueueSortedList 来处理任务。

using System.Collections.Concurrent;public class TaskQueue
{private readonly ConcurrentQueue<ScheduledTask> _tasks = new ConcurrentQueue<ScheduledTask>();public void Enqueue(ScheduledTask task){_tasks.Enqueue(task);}public ScheduledTask Dequeue(){return _tasks.TryDequeue(out var task) ? task : null;}public IEnumerable<ScheduledTask> GetAllTasks(){return _tasks.OrderBy(task => task.ExecutionTime).ThenBy(task => task.Priority).ToList();}
}

3. 定时调度器

定时调度器的作用是定期检查任务队列,并根据任务的执行时间和优先级将任务分发到线程池中执行。

using System.Threading;
using System.Threading.Tasks;public class Scheduler
{private readonly TaskQueue _taskQueue;private readonly Timer _timer;private readonly int _checkInterval;private readonly SemaphoreSlim _semaphore;public Scheduler(TaskQueue taskQueue, int checkInterval){_taskQueue = taskQueue;_checkInterval = checkInterval;_semaphore = new SemaphoreSlim(1, 1); // 保证任务分发是单线程执行_timer = new Timer(CheckAndDispatchTasks, null, 0, _checkInterval);}private async void CheckAndDispatchTasks(object? state){await _semaphore.WaitAsync(); // 防止并发执行try{var now = DateTime.Now;var tasksToDispatch = _taskQueue.GetAllTasks().Where(task => task.ExecutionTime <= now && task.Status == TaskStatus.Pending).ToList();foreach (var task in tasksToDispatch){ThreadPool.QueueUserWorkItem(_ =>{try{task.Status = TaskStatus.Executing;Console.WriteLine($"Executing task: {task.TaskName}");task.TaskAction();task.Status = TaskStatus.Completed;}catch (Exception ex){task.Status = TaskStatus.Failed;Console.WriteLine($"Task {task.TaskName} failed: {ex.Message}");}});}}finally{_semaphore.Release();}}
}

4. 动态线程池管理

我们可以根据任务的数量和执行时间,动态调整线程池的大小。这里使用一个简单的线程池大小调整策略:

public class DynamicThreadPool
{private readonly int _maxThreads;private readonly int _minThreads;private int _currentThreads;public DynamicThreadPool(int minThreads, int maxThreads){_minThreads = minThreads;_maxThreads = maxThreads;_currentThreads = minThreads;}public void AdjustThreadPoolSize(int taskCount){if (taskCount > _currentThreads && _currentThreads < _maxThreads){_currentThreads++;Console.WriteLine($"Thread pool size increased to {_currentThreads}");}else if (taskCount < _currentThreads && _currentThreads > _minThreads){_currentThreads--;Console.WriteLine($"Thread pool size decreased to {_currentThreads}");}ThreadPool.SetMinThreads(_currentThreads, _currentThreads);}
}

5. 示例应用

结合以上模块,我们编写一个简单的定时任务系统:

using System;class Program
{static void Main(string[] args){var taskQueue = new TaskQueue();// 添加定时任务taskQueue.Enqueue(new ScheduledTask("Task 1",DateTime.Now.AddSeconds(5),() => Console.WriteLine($"Task 1 executed at {DateTime.Now}")));taskQueue.Enqueue(new ScheduledTask("Task 2",DateTime.Now.AddSeconds(10),() => Console.WriteLine($"Task 2 executed at {DateTime.Now}")));// 启动调度器var scheduler = new Scheduler(taskQueue, 1000);var threadPool = new DynamicThreadPool(2, 10);Console.WriteLine("Scheduler started. Press any key to exit...");Console.ReadKey();}
}

6. 执行结果

在这里插入图片描述

三、优势解析

  1. 线程复用与动态调整:利用线程池避免了频繁创建和销毁线程,并且支持动态调整线程池大小以应对不同负载。
  2. 任务优先级管理:通过优先级字段实现高优先级任务的优先执行,确保任务按照预定逻辑执行。
  3. 任务状态管理:支持任务执行状态的管理,能够跟踪任务的执行过程,并进行错误处理。
  4. 并发安全:通过 SemaphoreSlimBlockingCollection 等机制确保任务分发的线程安全。

四、改进方向

  1. 任务重试机制:对于执行失败的任务,可以增加重试机制,避免因为临时问题导致任务永久失败。
  2. 任务超时处理:为每个任务设置超时时间,超时未执行的任务可以做特殊处理(比如重试或通知用户)。
  3. 任务结果回调:可以为任务添加执行后的回调方法,例如执行成功后通知用户或记录日志。

五、总结

本文通过结合任务队列、线程池和定时调度器,构建了一个高效、灵活的定时任务系统。该框架具有高扩展性,能够处理多种实际应用场景。在实际项目中,可以根据需求进一步优化和扩展,如增加动态调整线程池大小、任务优先级管理、任务状态管理等功能。

相关文章:

使用任务队列TaskQueue和线程池ThreadPool技术实现自定义定时任务框架详解

前言 在桌面软件开发中&#xff0c;定时任务是一个常见的需求&#xff0c;比如定时清理日志、发送提醒邮件或执行数据备份等操作。在C#中有一个非常著名的定时任务处理库Hangfire&#xff0c;不过在我们深入了解Hangfire 之前&#xff0c;我们可以手动开发一个定时任务案例&am…...

在IDE中使用Git

我们在开发的时候肯定是经常使用IDE进行开发的&#xff0c;所以在IDE中使用Git也是非常常用的&#xff0c;接下来以IDEA为例&#xff0c;其他的VS code &#xff0c;Pycharm等IDE都是一样的。 在IDEA中配置Git 1.打开IDEA 2.点击setting 3.直接搜索git 如果已经安装了会自…...

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕&#xff01;对于许多编程爱好者来说&#xff0c;这不仅是一次展示自我能力的舞台&#xff0c;更是一次学习和成长的机会。作为一名大一新生的小蓝&#xff0c;对蓝桥杯充满了期待&#xff0c;但面对初次参赛的…...

Docker Swarm实战

文章目录 1、docker swarm介绍2、docker swarm概念与架构2.1 架构2.2 概念 3、docker swarm集群部署3.1 容器镜像仓库 Harbor准备3.2 主机准备3.2.1 主机名3.2.2 IP地址3.2.3 主机名与IP地址解析3.3.4 主机时间同步3.2.5 主机安全设置 3.3 docker安装3.3.1 docker安装3.3.2 配置…...

磁盘空间占用分析工具-wiztree【推荐】

磁盘空间占用分析工具-wiztree【推荐】 如果你遇到过磁盘空间占满、找大文件困难、线上服务器空间飙升等一系列磁盘的问题&#xff0c;并且需要分析文件夹占用空间&#xff0c;传统的方法就是一个一个去看&#xff0c;属实太费劲&#xff0c;效率太低。 而“WizTree”便可解决…...

Vuex在uniapp中的使用

文章目录 一、Vuex概述 1.1 官方解释 1.2 大白话 1.3 组件间共享数据的方式 1.4 再看Vuex是什么 1.5 使用Vuex统一管理好处 二、状态管理 2.1 单页面状态管理 2.2 多页面状态管理 2.3 全局单例模式 2.4 管理哪些状态 三、Vuex的基本使用 3.1 安装 3.2 导入 3.3 创建store对象…...

【含开题报告+文档+PPT+源码】基于微信小程序的点餐系统的设计与实现

开题报告 随着互联网技术的日益成熟和消费者生活水平与需求层次的显著提升&#xff0c;外卖点餐平台在中国市场上迅速兴起并深深植根于民众日常生活的各个角落。这类平台的核心在于构建了一个基于互联网的强大订餐服务系统&#xff0c;它无缝整合了餐饮商户资源与广大消费者的…...

Elasticsearch02-安装7.x

零、文章目录 Elasticsearch02-安装7.x 1、Windows安装Elasticsearch &#xff08;1&#xff09;JDK安装 Elasticsearch是基于java开发的&#xff0c;所以需要安装JDK。我们安装的Elasticsearch版本是7.15&#xff0c;对应JDK至少1.8版本以上。也可以不安装jdk&#xff0c;…...

【数据库】选择题+填空+简答

1.关于冗余数据的叙述中&#xff0c;不正确的是&#xff08;&#xff09; A.冗余的存在容易破坏数据库的完整新 B.冗余的存在给数据库的维护增加困难 C.不应该在数据库中存储任何冗余数据 D.冗余数据是指由基本数据导出的数据 C 2.最终用户使用的数据视图称为&#xff08;&…...

Spark执行计划解析后是如何触发执行的?

在前一篇Spark SQL 执行计划解析源码分析中&#xff0c;笔者分析了Spark SQL 执行计划的解析&#xff0c;很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行&#xff0c;每个概念之间没有强烈的关联&#xff0c;因此这中间总感觉少了点…...

渗透测试-前端验签绕过之SHA256+RSA

本文是高级前端加解密与验签实战的第2篇文章&#xff0c;本系列文章实验靶场为Yakit里自带的Vulinbox靶场&#xff0c;本文讲述的是绕过SHA256RSA签名来爆破登录。 绕过 根据提示可以看出这次签名用了SHA2556和RSA两个技术进行加密。 查看源代码可以看到RSA公钥是通过请求服务…...

Maven完整技术汇总

额外知识点 IDE IDE是集成开发环境的缩写&#xff0c;它是一种软件应用程序&#xff0c;提供了编码、调试和部署软件的一站式解决方案。这些功能集成在一起&#xff0c;使开发人员能够在一个环境中完成整个软件开发过程&#xff0c;从编写代码到调试和测试&#xff0c;直到最终…...

NOI系列赛事LaTeX模板

NOI系列赛事 L a T e X LaTeX LaTeX 模板 照搬照抄&#xff1a; s y k s y k C C C syksykCCC syksykCCC 大佬写的&#xff0c;但是看得人不多。真的很好&#xff0c;比其他的板子优秀多了。现在我当一个校友搬运工&#xff0c;搬过来。 \documentclass[UTF8,a4paper]{ctex…...

JustTrustMe是什么

JustTrustMe是什么 JustTrustMe 是一个用于 Android 的 Xposed 模块&#xff0c;主要用于绕过应用程序的 SSL pinning&#xff08;SSL 证书锁定&#xff09;机制。SSL pinning 是一种安全措施&#xff0c;应用程序通过它来验证服务器返回的 SSL 证书是否与应用程序内置的证书匹…...

题解 - 工作分配

题目描述 在工厂里&#xff0c;如果每道工序让不同的工人来做&#xff0c;所要花费的时间往往不一样。精明的老板为了提高效率&#xff0c;总是把生产某一产品所需要的N道工序进行最佳搭配&#xff0c;使生产某一产品所花费的总时间最少。现在就给出N个工人分别做N道工序所要花…...

GLM-4-Plus初体验

引言&#xff1a;为什么高效的内容创作如此重要&#xff1f; 在当前竞争激烈的市场环境中&#xff0c;内容创作已成为品牌成功的重要支柱。无论是撰写营销文案、博客文章、社交媒体帖子&#xff0c;还是制作广告&#xff0c;优质的内容不仅能够帮助品牌吸引目标受众的注意力&a…...

【Python基础】Python知识库更新中。。。。

1、Python知识库简介 现阶段主要源于个人对 Python 编程世界的强烈兴趣探索&#xff0c;在深入钻研 Python 核心语法、丰富库函数应用以及多样化编程范式的基础上&#xff0c;逐步向外拓展延伸&#xff0c;深度挖掘其在数据分析、人工智能、网络开发等多个前沿领域的应用潜力&…...

【arm】程序跑飞,SWD端口不可用修复(N32G435CBL7)

项目场景&#xff1a; 国民N32G43X系列&#xff0c;烧录了一个测试程序&#xff0c;在DEBUG中不知什么原因挂掉&#xff0c;然后就无法连接SWD或JLINK。 问题描述 在SWD配置中不可见芯片型号&#xff0c;无法connect&#xff0c;无法烧录。但基本判断是芯片没有损坏。怀疑是程…...

C++如何读取包含空格在内的整行字符串s? ← getline(cin,s);

【问题描述】 问&#xff1a;请分析下面代码&#xff0c;在利用 cin 输入带空格的整行字符串时&#xff0c;会输出什么&#xff1f; #include <bits/stdc.h> using namespace std;int main() {string s;cin>>s;for(int i0; i<s.size(); i) {cout<<s[i];}…...

活动预告 | Microsoft 365 在线技术公开课:让组织针对 Microsoft Copilot 做好准备

课程介绍 通过Microsoft Learn免费参加Microsoft 365在线技术公开课&#xff0c;建立您需要的技能&#xff0c;以创造新的机会并加速您对Microsoft云技术的理解。参加我们举办的“让组织针对 Microsoft Copilot for Microsoft 365 做好准备” 在线技术公开课活动&#xff0c;学…...

tomcat被检测到目标URL存在htp host头攻击漏洞

AI越来越火了,我们想要不被淘汰就得主动拥抱。推荐一个人工智能学习网站,通俗易懂,风趣幽默,最重要的屌图甚多,忍不住分享一下给大家。点击跳转到网站 Tomcat被检测到目标URL存在http host头攻击漏洞,这个漏洞复现一下就是黑客访问你的网站,之后中修改请求头中的host属…...

【使用webrtc-streamer解析rtsp视频流】

webrtc-streamer WebRTC (Web Real-Time Communications) 是一项实时通讯技术&#xff0c;它允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点&#xff08;Peer-to-Peer&#xff09;的连接&#xff0c;实现视频流和&#xff08;或&a…...

【数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;编写一个程序实现单链表的基本运算。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;初始化线性表、销毁线性表、判定是否为空表、求线性…...

华为FreeBuds Pro 4丢了如何找回?(附查找功能使用方法)

华为FreeBuds Pro 4查找到底怎么用&#xff1f;华为FreeBuds Pro 4有星闪精确查找和离线查找&#xff0c;离线查找功能涵盖播放铃声、导航定位、星闪精确查找、上线通知、丢失模式、遗落提醒等。星闪精确查找是离线查找的子功能&#xff0c;当前仅华为FreeBuds Pro 4充电盒支持…...

直流开关电源技术及应用

文章目录 1. 开关电源概论1.1 开关电源稳压原理1.1.1 开关电源稳压原理 1. 开关电源概论 1.1 开关电源稳压原理 为了提高效率&#xff0c;必须使功率调整器件处于开关工作状态。 作为开关而言&#xff0c;导通时压降很小&#xff0c;几乎不消耗能量&#xff0c;关断时漏电流很…...

langchain 结构化输出

主要流程 1. 使用 Pydantic 定义结构化输出&#xff1a; 定义 AnswerWithJustification 类&#xff0c;用于描述输出的结构&#xff0c;包含以下字段&#xff1a; answer&#xff1a;答案内容&#xff08;字符串类型&#xff09;。justification&#xff1a;答案的理由或解释…...

开源Java快速自测工具,可以调用系统内任意一个方法

java快速测试框架&#xff0c;可以调到系统内任意一个方法&#xff0c;告别写单测和controller的困扰。 开源地址&#xff1a;https://gitee.com/missyouch/Easy-JTest 我们在开发时很多时候想要测试下自己的代码&#xff0c;特别是service层或者是更底层的代码&#xff0c;就…...

挺详细的记录electron【V 33.2.0】打包vue3项目为可执行程序

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、直接看效果 二、具体步骤 1.安装配置electron 1.将 electron 包安装到应用的开发依赖中。 2.安装electron-packager依赖&#xff08;打包可执行文件&#…...

相比普通LED显示屏,强力巨彩软模组有哪些优势?

在科技技术的加持下&#xff0c;LED显示屏市场各类创新产品层出不穷&#xff0c;为市场带来了无限可能。其中&#xff0c;强力巨彩R系列H版&#xff08;软模组&#xff09;凭借其独特的技术优势&#xff0c;在行业内脱颖而出。那么&#xff0c;相比常规LED显示屏&#xff0c;强…...

操作系统(7)处理机调度

前言 操作系统中的处理机调度是一个核心概念&#xff0c;它涉及如何从就绪队列中选择进程并将处理机分配给它以运行&#xff0c;从而实现进程的并发执行。 一、调度的层次 高级调度&#xff08;作业调度&#xff09;&#xff1a; 调度对象&#xff1a;作业&#xff08;包含程序…...

【Spark】Spark的两种核心Shuffle工作原理详解

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…...

10.qml使用 shadereffect 实现高斯模糊

目录 高斯模糊sigma获取加权均值获取 高斯二维公式实现高斯一维公式实现使用总结 高斯模糊 高斯模糊应用领域我就不过多讲解&#xff0c;想了解自己去了解 高斯模糊有 一维公式 二维公式 当然我们图像是二维的 但是实际上二维公式用于计算那是消耗大量的算力的&#xff0c…...

2024年12月GESPC++一级真题解析

一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 题目123456789101112131415答案 C C D B B D B C C C D C D B D 1.2024 年 10 月 8 日&#xff0c;诺贝尔物理学奖 “ 意外地 ” 颁给了两位计算机科学家约翰 霍普菲尔德&#xff08; John J. H…...

Nmap脚本参数详解

免责声明&#xff1a;使用本教程或工具&#xff0c;用户必须遵守所有适用的法律和法规&#xff0c;并且用户应自行承担所有风险和责任。 文章目录 一、 按脚本分类1. 检查身份验证机制2. 探测广播行为3. 登录爆破4. 默认脚本运行5. 网络资产发现6. Dos漏洞检测7. 漏洞利用8. 检…...

Rstudio-server的安装、配置、维护

一、安装Rstudio-server (1)安装R语言&#xff1a; sudo apt install r-base # 如果没有管理员权限无法操作 # 这样装上R默认在/usr/bin/R其实基本上的流程都可以参考posit的官网&#xff08;也就是Rstudio的官网&#xff09;&#xff1a; https://posit.co/download/rstudio…...

2024ECCV|DiffBIR: 基于生成扩散先验进行盲图像恢复

文章标题&#xff1a;《DiffBIR: Towards Blind Image Restoration with Generative Diffusion Prior》 DiffBIR收录于2024ECCV&#xff0c;是中科院深圳先进技术研究院&#xff08;董超等人&#xff09;、上海AI Lab和香港中文大学联合发布的一项研究。 原文链接&#xff1a;h…...

前端报错npm ERR cb() never called问题

环境使用node版本v14.21.3&#xff0c;npm版本6.14.18 1.问题描述 1.1使用npm install后报错 npm ERR! cb() never called!npm ERR! This is an error with npm itself. Please report this error at: npm ERR! ? ? <https://npm.community>npm ERR! A complete log…...

SLM510A系列——24V,15到150mA单通道可调电流线性恒流LED驱动芯片

SLM510A 系列产品是单通道、高精度、可调电流线性恒流源的 LED 驱动芯片&#xff0c;在各种 LED 照明产品中非常简单易用。其在宽电压输入范围内&#xff0c;能保证极高的输出电流精度&#xff0c;从而在大面积的光源照明中&#xff0c;都能让 LED 照明亮度保持均匀一致。 由于…...

VBA API 概述 / 声明 / 宏编程

注&#xff1a;本文为 “VBA API 概述 | 宏编程 | 执行速度慢” 相关文章合辑。 未整理去重。 VBA API 详解 Office 二次开发于 2020-12-17 22:27:10 发布 Office 版本变动 在 Office 2010 之前&#xff0c;微软仅提供 32-bit 版本的 Office。而自 Office 2010 起&#xff0…...

Python 开源项目精彩荟萃

一、Web 开发框架 Django 高效路由系统&#xff1a; 支持基于正则表达式的复杂 URL 模式匹配&#xff0c;精准定位视图函数&#xff0c;例如可通过r^articles/(?P<year>\d{4})/$这样的正则表达式来匹配特定年份的文章列表页面 URL&#xff0c;并将年份参数传递给视图函数…...

Debezium系列之:使用Debezium采集oceanbase数据库

Debezium系列之:使用Debezium采集oceanbase数据库 一、oceanbase数据库二、安装OceanBase三、安装oblogproxy四、基于Docker的简单采集案例五、生产实际应用案例Debezium 是一个开源的分布式平台,用于监控数据库变化和捕捉数据变动事件,并以事件流的形式导出到各种消费者。D…...

AI初创企业的未来趋势和潜在挑战

AI初创企业的未来趋势和潜在挑战 AI初创企业的未来趋势和潜在挑战可以从多个方面进行分析&#xff1a; 未来趋势 AI监管: 随着AI技术的快速发展&#xff0c;各国政府开始制定相关法规&#xff0c;以确保AI的安全和伦理使用。这将影响初创企业的运营模式和市场准入。 日常生活…...

Grafana配置告警规则推送企微机器人服务器资源告警

前提 已经部署Grafana&#xff0c;并且dashboard接入数据 大屏编号地址&#xff1a;Node Exporter Full | Grafana Labs 创建企微机器人 备注&#xff1a;群里若有第三方外部人员不能创建 机器人创建完成&#xff0c;记录下来Webhook地址 Grafana配置告警消息模板 {{ define &…...

RFDiffusion xyz_to_c6d函数解读

函数 xyz_to_c6d将给定的蛋白质主链坐标 (N,Cα,C)转换为 6D矩阵表示,即用以下几何特征描述两两残基之间的关系: 距离 dist:残基间 Cβ 原子的欧几里得距离。二面角 omega:两个残基的 Cα−Cβ 向量之间的二面角。二面角 theta:由 N−Cα−Cβ和 Cβ间向量定义的二面角。平…...

#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍01

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…...

VSCode 报错:rust-analyzer requires glibc >= 2.28 in latest build

报错信息 /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.953/server/rust-analyzer: /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.29 not found (required by /home/jake/.vscode-server-insiders/extensions/matklad.rust-analyzer-0.3.9…...

x2go远程控制

X2Go 优点&#xff1a;专为远程桌面和图形界面优化。性能优越&#xff0c;特别是在网络带宽较低的情况下&#xff0c;采用了高效的压缩和缓存技术。支持多用户、会话恢复功能&#xff0c;适合企业使用。使用 SSH 连接&#xff0c;具有较好的安全性。 安装与配置&#xff1a;需…...

SQL 单表查询练习题(一)

在 SQL 的学习过程中&#xff0c;单表查询是非常重要的基础部分&#xff0c;下面为大家分享一些单表查询的练习题以及对应的正确答案&#xff0c;希望能帮助大家更好地掌握相关知识。 一、题目及答案详情 1. 查询课程表中&#xff0c;没有前序课程的课程信息&#xff0c;查询…...

Ubuntu 安装texstudio sty与texlive

手动安装需要的包 访问CTAN网站&#xff08;Comprehensive TeX Archive Network&#xff09;并下载enumitem宏包&#xff1a; enumitem CTAN页面下载后&#xff0c;将宏包解压到/usr/share/texmf/tex/latex/下。 可打开texstudio/帮助/宏包帮助下载。 如果不想手动安装一个个…...

DevExpress WPF中文教程:Grid - 如何移动和调整列大小?(一)

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…...