其他分享
首页 > 其他分享> > 如何从lambda创建Quartz.Net作业?

如何从lambda创建Quartz.Net作业?

作者:互联网

是否可以通过Quartz.net中的lambda创建作业?

我有很多任务需要运行,我真的想避免必须为每个工作创建几十个类.我不需要任何高级设置,只需要不时地调用一个方法.

scheduler.ScheduleJob(() => DoSomething(a), TimeSpan.FromSeconds(10));
scheduler.ScheduleJob(() => DoAnotherThing(b), TimeSpan.FromSeconds(20));
scheduler.ScheduleJob(() => DoThis(c), TimeSpan.FromHours(2));
scheduler.ScheduleJob(() => DoThat(d), TimeSpan.FromMinutes(30));
...

我会为此创建一个扩展方法,但似乎每个作业都需要使用自己的类型才能创建IJob,这使事情比应该做的要难.

关于如何做到这一点的任何想法?

解决方法:

好的,我缺少参数的jobdata.如果有人需要,我可以使用以下代码完成此操作:

using Quartz;
using System;

namespace MyApp
{
    public static class SchedulerExtensions
    {
        public static DateTimeOffset ScheduleJob(this IScheduler scheduler, Action action, TimeSpan initialDelay, TimeSpan interval)
        {
            var data = new JobDataMap();
            data.Add("_", action);

            var jobDetail = JobBuilder.Create<GenericJob>().UsingJobData(data).Build();

            var trigger = TriggerBuilder.Create()
                .StartAt(DateTimeOffset.UtcNow.Add(initialDelay))
                .WithSimpleSchedule(s => s.WithInterval(interval).RepeatForever())
                .Build();

            return scheduler.ScheduleJob(jobDetail, trigger);
        }

        class GenericJob : IJob
        {
            public void Execute(IJobExecutionContext context)
            {
                (context.JobDetail.JobDataMap["_"] as Action)?.Invoke();
            }
        }
    }
}

标签:quartz-net,c
来源: https://codeday.me/bug/20191026/1935731.html