framework/netcore 任务调度 FluentScheduler

本文介绍了如何在.NET Core和.NET Framework中使用FluentScheduler库来创建和注册任务调度。相比于Hangfire和Quartz,FluentScheduler更轻量级,无需数据库,仅通过类库即可实现任务调度。步骤包括创建项目、安装Nuget包、定义任务和调度策略,以及在.NET Core中的Startup或.NET Framework中的Global.asax中进行注册。对于.NET Framework项目,还需要考虑IIS程序池回收导致的任务停止问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

比起Hangfire或者quartz来,FluentScheduler相对就简单得多,它只是提供了一个类库,提供任务调度的基本功能,没有像hangfire的数据库,web服务的依赖,功能变少,也更加简单了。非常适用于任务调度功能的集成。

netCore:

1、先建一个netcore的 job项目服务

2、nuget包安装: FluentScheduler

3、新建下面这两个class类

     public class TestRegistry : Registry
    {
        /// <summary>
        /// 服务注册(可以理解为:任务执行的计划策略)
        /// </summary>
        public TestRegistry()
        {
            //并行配置:
            //方法一:.NonReentrantAsDefault()不允许并行执行,(任务每次需等待执行完成后,才能开启下一次的执行,防止并发执行带来的问题),
            //方法二::同样的效果.NonReentrant()使用了,就不用NonReentrantAsDefault()了
            NonReentrantAsDefault();

            //// Schedule an IJob to run at an interval
            //// 立即执行,每5秒一次的计划任务。(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
            Schedule<TestJob>().ToRunNow().AndEvery(5).Seconds();
            //// 与上面这个一样,只不过加了,不能并行。其他的也可以使用 .NonReentrant()
            //Schedule<TestJob>().NonReentrant().ToRunNow().AndEvery(5).Seconds();

            //在每天的21:15执行计划任务
            //Schedule<TestJob>().ToRunEvery(1).Days().At(11, 33);

            //// 立即执行,一个在每月的第一个星期一 3:00 的计划任务
            //Schedule<TestJob>().ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);

            ////在每周一的21:15执行计划任务
            //Schedule<TestJob>().ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21, 15);

        }
    }

    ///job的具体操作
    public class TestJob : IJob
    {
        public void Execute()
        {
            try
            {

                //处理业务逻辑
                Console.WriteLine("haha");
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

4、startup注册一下

 

AddFluentScheduler是自己写的扩展类,代码:

public static class ServiceCollectionExtensions
    {
        public static void AddFluentScheduler(this IServiceCollection serviceCollection)
        {
            //扫描当前程序集中实现(继承)了Registry的类,比如我们的 TestRegistry
            //扫描当前程序集下面所有的自定义定时Job任务
            var registry = Assembly.GetExecutingAssembly().GetTypes()
                .Where(x => !x.IsInterface && !x.IsSealed && !x.IsAbstract && typeof(Registry).IsAssignableFrom(x))
                .Select(x => x.Assembly.CreateInstance(x.FullName) as Registry)?.ToArray();

            //注册并同步服务
            JobManager.Initialize(registry);
        }
    }

就是个批量扫描注册的扩展类,就不用一个一个注册了。

以上就完事了,也不需要数据库,只需要引用类库就可以做到定时任务。

NetFramework

跟上面core的搭建差不多,就是启动类和部署的问题(4-5)。

1、比如我创建个 framework4.5的空项目  (一样)

 

2、nuget包安装: FluentScheduler  (一样)

3、新建下面这两个class类  (一样)

     public class TestRegistry : Registry
    {
        /// <summary>
        /// 服务注册(可以理解为:任务执行的计划策略)
        /// </summary>
        public TestRegistry()
        {
            //并行配置:
            //方法一:.NonReentrantAsDefault()不允许并行执行,(任务每次需等待执行完成后,才能开启下一次的执行,防止并发执行带来的问题),
            //方法二::同样的效果.NonReentrant()使用了,就不用NonReentrantAsDefault()了
            NonReentrantAsDefault();

            //// Schedule an IJob to run at an interval
            //// 立即执行,每5秒一次的计划任务。(指定一个时间间隔运行,根据自己需求,可以是秒、分、时、天、月、年等。)
            Schedule<TestJob>().ToRunNow().AndEvery(5).Seconds();
            //// 与上面这个一样,只不过加了,不能并行。其他的也可以使用 .NonReentrant()
            //Schedule<TestJob>().NonReentrant().ToRunNow().AndEvery(5).Seconds();

            //在每天的21:15执行计划任务
            //Schedule<TestJob>().ToRunEvery(1).Days().At(11, 33);

            //// 立即执行,一个在每月的第一个星期一 3:00 的计划任务
            //Schedule<TestJob>().ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);

            ////在每周一的21:15执行计划任务
            //Schedule<TestJob>().ToRunEvery(1).Weeks().On(DayOfWeek.Monday).At(21, 15);

        }
    }

    ///job的具体操作
    public class TestJob : IJob
    {
        public void Execute()
        {
            try
            {

                //处理业务逻辑
                Console.WriteLine("haha");
            }
            catch (Exception)
            {
                throw;
            }
        }
    }

4、这里不一样,netframework因为没有启动类startup,那就加个Global.asax启动类 (如果网站已经建立就不会看到此项目,一个Web网站只能拥有一个Global.asax文件)

 5、然后在global的Application_Start里面注册就行了

 6、上面就算可以了,但是netframework项目一般是部署在iis上面,这样就会出现一个问题,iis的程序池长时间不访问就会回收。我这边是这么处理的:再每次结束的时候再请求一次网站地址

 或者可自行百度其他方法,我看了别的什么iis程序池回收的时候再请求一次网站、预加载什么的方法其实也都可以,因为我懒所以就写上面的代码了。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值