Asp.net 如何使用任务调度

从零搭建一个带Web界面的任务调度中心:基于Hangfire的ASP.NET Core实战 本文详细介绍了如何在ASP.NET Core项目中集成Hangfire,从零搭建一个功能完备的任务调度中心。内容涵盖基础配置、Dashboard安全策略、任务调度实战技巧以及高级性能优化,特别适合需要处理后台任务的.NET开发者。通过Hangfire的Web管理界面和多种任务类型支持,开发者可以轻松实现定时报表生成、异步消息队列管理等复杂场景。 阅读详情

首先需要再 Global文件中,创建调度器,哎呀,直接上代码吧

public class MvcApplication : System.Web.HttpApplication
{
    private static IScheduler _scheduler;
    private ScheduleJobsManager  _jobMana;
    protected void Application_Start()
    {
        

        var factory = new StdSchedulerFactory();
       
        _scheduler = factory.GetScheduler();
        _scheduler.Start();
        _jobMana = new ScheduleJobsManager(_scheduler);
      
        RegisterJobs();




       


    }

//在网站启动的时候,将数据库中正在运行状态的任务,启动起来
 private  void RegisterJobs()
 {
     var list = _jobMana.GetList(s => s.JobStatus == "Running");
     foreach (var job in list)
     {
         _jobMana.AddJob(job);

     }

 }

//这个方法,是在其他地方使用的,相当于 单例模式,全局只有这一个调度器
 public static IScheduler GetScheduler()
 {
     return _scheduler;
 }

}

接下来说下,管理任务调度的控制器和界面

控制器这样写:

 private  IScheduler _scheduler = MvcApplication.GetScheduler();//这个就是Global中的那个静态方法
 private ScheduleJobsManager _scheduleJobsManager; //这个是对任务调度的一个封装,也是操作数据的操作类,后面会给代码
 private JobLogsManager _jobLog = new JobLogsManager();  //这个是与数据库对用的Job日志操作类

//初始化控制器,需要给调度管理进行初始化
 public JobController()
 {
     _scheduleJobsManager = new ScheduleJobsManager(_scheduler);
 }


 public ActionResult Add(ScheduleJobs job)
 {
     job.JobStatus = "Running";
     job.CreateTime = DateTime.Now;
     _scheduleJobsManager.Insert(job);

     _scheduleJobsManager.AddJob(job);



     return Json(new { code = 0, msg = "添加成功" });
 }

 public ActionResult Pause(int id)
 {
     try
     {
        if( _scheduleJobsManager.PauseJob(id))
         {
             return Json(new { code = 0, msg = "暂停成功" });
         }
         else
         {
             return Json(new { code = 500, msg = "暂停失败" });
         }
        
     }
     catch (Exception ex)
     {
         return Json(new { code = 500, msg = "暂停失败:" + ex.Message });
     }
 }



 [HttpPost]
 public ActionResult Resume(int id)
 {
     try
     {
         if(_scheduleJobsManager.ResumeJob(id))
         {
             return Json(new { code = 0, msg = "恢复成功" });
         }
         return Json(new { code = 500, msg = "恢复失败"  });
     }
     catch (Exception ex)
     {
         return Json(new { code = 500, msg = "恢复失败:" + ex.Message });
     }
 }



 [HttpPost]
 public ActionResult Delete(int Id)
 {
     var info = _scheduleJobsManager.GetById(Id);
     if (_scheduleJobsManager.Delete(s => s.Id == Id))
     {
         _scheduleJobsManager.DeleteJob(info);
         return Json(new { code = 0, msg = "删除成功" });
     }
     else
     {
         return Json(new { code = -1, msg = "删除失败" });
     }
 }


 [HttpPost]
 public ActionResult Edit(ScheduleJobs job)
 {
     var existingJob =_scheduleJobsManager.GetById(job.Id);
     if (existingJob == null)
         throw new Exception("任务不存在");

     try
     {
         // 删除旧的任务
          _scheduler.DeleteJob(new JobKey(existingJob.JobName, existingJob.JobGroup));

         // 创建新的任务
         _scheduleJobsManager.AddJob(job);
         existingJob.JobName = job.JobName;
         existingJob.JobGroup = job.JobGroup;
         existingJob.JobClassName = job.JobClassName;
         existingJob.AssemblyName = job.AssemblyName;
         existingJob.CronExpression = job.CronExpression;
         existingJob.Description = job.Description;
         
         _scheduleJobsManager.Update(existingJob);
         return Json(new { code = 0, msg = "更新成功" });
     }
     catch (Exception ex)
     {
         return Json(new { code = 500, msg = "更新失败:" + ex.Message });
     }
 }

ScheduleJobsManager.cs

public class ScheduleJobsManager : DbContext<ScheduleJobs>
{

    //当前类已经继承了 DbContext增、删、查、改的方法
    private readonly IScheduler _scheduler ;
    public ScheduleJobsManager(IScheduler scheduler) {
        _scheduler = scheduler ;
    }

    public void RunJobOnce(int id)
    {
        var job = GetById(id);
        if (job == null)
            throw new Exception("任务不存在");

        var jobKey = new JobKey(job.JobName, job.JobGroup);
        _scheduler.TriggerJob(jobKey);
    }

    private IJobDetail CreateJobDetail(ScheduleJobs jobInfo)
    {
        // 获取任务类型
        Type jobType;
        if (string.IsNullOrEmpty(jobInfo.AssemblyName))
        {
            // 从当前程序集获取类型
            jobType = Type.GetType(jobInfo.JobClassName);
        }
        else
        {
            // 从指定程序集加载类型
            var assembly = Assembly.Load(jobInfo.AssemblyName);
            jobType = assembly.GetType(jobInfo.JobClassName);
        }

        if (jobType == null)
        {
            throw new Exception($"找不到任务类型:{jobInfo.JobClassName}");
        }

        // 验证类型是否实现IJob接口
        if (!typeof(IJob).IsAssignableFrom(jobType))
        {
            throw new Exception($"任务类型 {jobInfo.JobClassName} 必须实现IJob接口");
        }

        // 创建任务详情
        return JobBuilder.Create(jobType)
            .WithIdentity(jobInfo.JobName, jobInfo.JobGroup)
            .WithDescription(jobInfo.Description)
            .UsingJobData("jobId", jobInfo.Id)  // 传递任务ID
            .Build();
    }

    public void AddJob(ScheduleJobs job)
    {
        try
        {
            // 创建任务
            var jobDetail = CreateJobDetail(job);

            var trigger = TriggerBuilder.Create()
                .WithIdentity($"{job.JobName}_trigger", job.JobGroup)
                .WithCronSchedule(job.CronExpression)
                .Build();

            // 添加到调度器
            _scheduler.ScheduleJob(jobDetail, trigger);

        }
        catch (Exception ex)
        {
            throw new Exception($"添加任务失败: {ex.Message}", ex);
        }
    }

    public bool PauseJob(int id)
    {
        
        var job = GetById(id);
         _scheduler.PauseJob(new JobKey(job.JobName, job.JobGroup));
        job.JobStatus = "Paused";
        return Update(job);



    }

    public bool ResumeJob(int id)
    {
       
        
            var job = GetById(id);
            _scheduler.ResumeJob(new JobKey(job.JobName, job.JobGroup));
            job.JobStatus = "Running";
            return Update(job);
           
          
        
    }

    public void DeleteJob(ScheduleJobs job)
    {
        
       
             _scheduler.DeleteJob(new JobKey(job.JobName, job.JobGroup));
           
        
    }


  
 
}

View界面就是简单的添加修改删除,用的layui框架做的,这个就做代码了,自己用自己的框架做吧

2021-06-27 .NET高级班 72-ASP.NET Core Hangfire任务调度的使用 一:控制台应用 1.首先nuget引入 Hangfire.core Hangfire.SqlServer 2.具体使用代码 static void Main(string[] args) { try { //1.nuget引入:Hangfire.core // Hangfire.SqlServer GlobalConfiguration.Configuration .SetDataCompat. 阅读详情

相关推荐

2021-06-26 .NET高级班 72-ASP.NET Core Hangfire任务调度的使用

一:控制台应用 1.首先nuget引入 Hangfire.core Hangfire.SqlServer 2.具体使用代码 static void Main(string[] args) { try { //1.nuget引入:Hangfire.core // Hangfire.SqlServer GlobalConfiguration.Configuration .SetDataCompati

愚公智库 5万+

如何使用Asp.net Core实现定时任务,轻松解决任务调度问题!

本篇文章主要介绍如何使用Asp.net core自带的Hosting模块和System.Timers.Timer类,以及Hangfire和Quartz.NET分别实现定时任务。将展示一个完整的示例代码,并详细解释代码中各个部分的含义和作用,以帮助理解实现过程和相关知识点。

Z__7Gk的博客 7757

RFSOC实战解析:MTS多片同步的时序校准与相位相干实现

本文深入解析了在RFSOC平台上实现MTS多片同步的关键技术与实战流程。文章从相位相干的重要性出发,详细阐述了SYSREF与SYNC信号的协同工作机制,并提供了从硬件时钟配置到软件API调用的完整MTS实现步骤。重点探讨了时序校准的核心方法,旨在帮助工程师解决多通道系统相位不一致的难题,确保ADC与DAC达到精确的相位相干,从而构建高性能的MIMO和相控阵系统。

weixin_29206669的博客 192

Asp.net MVC scheduler实现

Asp.net MVC scheduler实现

我的英文站点:https://iorilan.medium.com/ 1246

使用C#调用百度地图并实现坐标点的设置以及读取

使用C#调用百度地图申请百度地图密钥以及查看百度API程序实现功能:最终图利用webBrowser控件展示地图 申请百度地图密钥以及查看百度API 网址:http://lbsyun.baidu.com/apiconsole/key#/home 网址:http://lbsyun.baidu.com/jsdemo.htm#c1_3 程序实现功能: 1、输入网址那可以调用本地的html文件,也可以访问其他网站 2、输入坐标、添加坐标按钮,可以将坐标值传入html文件中,显示在经纬度的文本框中 3、定位按钮可以

qq_39261042的博客 3735

点云图的学习

一。点云地图拼接 1.1 配置运行环境 首先配置安装opencv3,安装完成后如下图: 然后配置点云图工具pcl,直接使用apt即可安装,安装后如下图: 最后使用点云工具观察点云图: 1.2 原理解析 总的来说由多角度拍摄图片拼接为点云3D图,是通过相机的内参,将像素坐标转化为相机坐标,再通过外参将相机坐标转化为世界坐标系,然后将每张图片的像素绘制填充于同一个世界坐标系下面,形成点云3D图。...

ff_xun的博客 1万+

ASP.NET MVC5 实现基于Quartz.NET任务调度

工作之余。技术?。记是不可能记住的。 只有写点东西 才能维持得了生活这样子的。好早就像写一篇关于任务调度的文章。终究是太懒了 一、Quartz.NET介绍 Quartz.NET是一个强大、开源、轻量的作业调度框架,是 OpenSymphony 的 Quartz API 的.NET移植,用C#改写,可用于winform和asp.net应用中。它灵活而不复杂。你能够用它来为执行一个作业...

A15210311344的博客 521

告别机载网络通信混乱:利用ARINC825的LCC与带宽管理机制构建高可靠CAN总线

本文深入探讨了ARINC825规范如何通过逻辑通信通道(LCC)和带宽管理机制解决机载CAN总线通信的混乱问题。文章详细解析了ARINC825的核心架构设计、LCC工程实现、时间触发带宽管理等关键技术,展示了其在提升航空电子系统可靠性和实时性方面的显著效果,为现代飞机通信系统提供了高可靠解决方案。

weixin_26878995的博客 241

ASP.NET MVC 5实现基于Quartz.net 的任务调度管理平台(一)

任务管理平台系统简介Quartz.net是一个开源的任务调度工具,相当于数据库中的 Job、Windows 的计划任务、Unix/Linux 下的 Cron,但 Quartz 可以把排程控制的更精细,对任务调度的领域问题进行了高度的抽象,实现作业的灵活调度。任务管理平台通过window服务来集成Quartz.net 实现作业的调度,只需要修改配置文件和添加相应Job即可完成作业添加,使用简单方便。项

极客神殿 4110

Android实战——白天黑夜模式设置

白天黑夜模式是一种动态的UI模式,根据当前时间或用户设置的偏好,在白天和黑夜之间进行切换。它通过调整应用程序的颜色、亮度和其他可视化元素来提供更加舒适和易读的用户界面。

小旭的专栏 5229

【AI面试】 Python 的装饰器

Python装饰器是一种高阶函数,用于在不修改原函数代码的情况下增强其功能。它通过@语法糖接收目标函数作为参数,并返回一个包含额外逻辑(如日志、缓存、权限验证等)的新函数。装饰器的核心价值在于代码复用和解耦,符合开闭原则,典型应用包括性能分析、权限控制等场景。例如,@timer_decorator可自动为函数添加耗时统计功能。本质上,@decorator等价于func = decorator(func),实际调用的是装饰器返回的包装函数。进阶技巧包括使用@functools.wraps保留原函数元信息。装饰

钱多多先森 184

基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度

在之前的文章《推荐一个简单、轻量、功能非常强大的C#/ASP.NET定时任务执行管理器组件–FluentScheduler》和《简单、轻量、功能非常强大的C#/ASP.NET定时调度任务执行管理组件–FluentScheduler之实例篇》中,我们认识和了解了FluentScheduler这款轻量的定时任务调度执行组件。今天再给大家介绍一款关于定时任务调...

weixin_33738982的博客 828

YOLOv11改进缝合注意力 | 深度优化的BiFormer模型-结合BiLevel Routing Attention与深度可分离卷积的创新应用(附代码)

YOLO(You Only Look Once)系列目标检测算法一直以来都是计算机视觉领域的热门选择。随着YOLOv11的发布,它在许多实际应用场景中取得了显著的性能提升。然而,面对日益复杂的目标检测任务,单纯依赖卷积神经网络(CNN)在某些情况下已经显得力不从心,特别是在处理小尺度、密集目标以及遮挡目标时,卷积操作的局部性限制了模型的表达能力。

一键难忘的博客 716

.net 任务调度 mysql_ASP.NET Core开源任务调度平台 快速上手

原标题:ASP.NET Core开源任务调度平台 快速上手转自:hohocnblogs.com/hohoa/p/12197518.html概述ScheduleMaster是一个开源的分布式任务调度系统,它基于ASP.NET Core平台构建,支持跨平台多节点部署运行。项目主页:https://github.com/hey-hoho/ScheduleMasterCore关于它的简单介绍《ASP.NE...

weixin_28713299的博客 191

AI故障预测系统架构设计:5个核心模块+3种主流架构,收藏这篇就够了

深夜11点,某汽车工厂的生产线突然停机——核心机器人的轴承磨损过度导致卡壳。维修人员连夜抢修,直接损失超过50万元,还延误了客户的交货期。传统的“事后维修”或“定期维护”要么代价高昂,要么防不胜防。AI故障预测系统的出现,让“精准维护”成为可能——它能通过传感器数据提前7-30天预警故障,将停机损失降低80%以上。知道要做故障预测,却不知道怎么搭系统——数据怎么采集?特征怎么提取?模型怎么部署?架构怎么选?本文将解决这些问题:我们会拆解AI故障预测系统的5个核心模块,分析3种主流架构。

AIGC应用创新大全的博客 1020

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【愚公系列】2022年05月 ASP.NET Core下Worker Service构建系统服务实现任务调度

当你想到ASP.NET Core时,可能会想到Web应用程序后端代码,包括MVC和WebAPI。MVC视图和Razor页面还允许使用后端代码生成带有HTML元素的前端UI。全新的Blazor更进一步,允许使用WebAssembly在Web浏览器中运行客户端.NET代码。最后,我们现在有了一个Worker Service应用程序的模板。这是在ASP.NET Core早期预览中引入的。虽然项目模板最初列在Web模板下,但此后在向导中重新定位了一个级别。

愚公智库 56万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度

当我们在web开发中,常常会遇到这么一个需求,在后台执行某一项具体的任务,具体的说就是这些任务必须在后台定时执行。Quartz.NET 是一个开源的 JAVA 移植版,它有着悠久的历史并且...

farway000的博客 583

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

views 多个文件夹 netcore_ASP.NET Core开源任务调度平台 快速上手

(给DotNet加星标,提升.Net技能)转自:hohocnblogs.com/hohoa/p/12197518.html概述ScheduleMaster是一个开源的分布式任务调度系统,它基于ASP.NET Core平台构建,支持跨平台多节点部署运行。项目主页:https://github.com/hey-hoho/ScheduleMasterCore关于它的简单介绍《ASP.NET C...

weixin_39960147的博客 286

简易任务调度实现--可用于windows服务/asp.net网站执行后台计算

在项目开发中经常会遇到后台定时任务调度执行计算的需求,为此我实现了一个简易的任务调度框架。 首先,我只实现的简易调度框架,原则上在同一时间点只执行一个任务,实现在每天指定的时间段内执行一次或固定频率(只是相对固定)执行多次任务。 其次,这个简易框架可用于windows 服务或asp.net网站实现后台定时调度任务计算。 要实现任务调度,使用核心技术的就是System.Timers.Timer

yuan_jie 760

asp问卷调查系统源码--实用性增强版_Asp.Net Core下的开源任务调度平台ScheduleMaster—快速上手...

概述ScheduleMaster是一个开源的分布式任务调度系统,它基于Asp.Net Core平台构建,支持跨平台多节点部署运行。它的项目主页在这里:https://github.com/hey-hoho/ScheduleMasterCore关于它的简单介绍可以看这里:https://www.cnblogs.com/hohoa/p/12162581.html本地部署使用前请准备好所需环境...

weixin_30325875的博客 776
上一篇: uniapp 自定义的滑杆(支持一个屏幕2个滑杆同时滑动)
下一篇: Windows server 中使用nginx遇到的坑
Little_Code
博客等级 码龄10年 62粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值