是否可以在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,这会使事情变得比它们更难。
关于如何实现这一目标的任何想法?
答案 0 :(得分:3)
好的,我缺少参数的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();
}
}
}
}
答案 1 :(得分:1)
写了一个允许起诉lambda语法的小扩展库。
scheduler.ScheduleJob(() => Console.WriteLine("With TriggerBuilder"),
builder => builder.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.RepeatForever()));
scheduler.ScheduleJob(() => Console.WriteLine("With int delay and interval"), 0, 10);