我正在尝试学习Quartz.NET的细节,但是我没有取得很大的进展,我认为这是一项非常简单的任务。
我有一个接收Action和DateTime的方法,我只需要安排动作X在Y时刻运行。
这看起来很简单,但是JobBuilder.Create()需要一个实现IJob的类型参数......但是我没有丝毫知道我收到的动作是什么,直到我拥有它。我不能拥有一个定义良好的Execute(IJobExecutionContext context)方法的类,因为我在编译时没有那些信息。
我也无法改变我方法的签名。我得到一个Action和一个DateTime,这不是我的决定。
Quartz真的无法处理这个看似简单的任务吗?
答案 0 :(得分:5)
我不认为Quartz具有内置的这种特殊功能,但在Quartz的现有API上实现它是微不足道的:
class RunActionJob : IJob
{
public void Execute(IJobExecutionContext context)
{
var action = context.MergedJobDataMap["action"] as Action;
action();
}
}
public static JobBuilder ActionJob(Action action)
{
return JobBuilder
.Create<RunActionJob>()
.SetJobData(new JobDataMap
{
{"action", action}
});
}
// Usage:
var job = ActionJob(() => Console.WriteLine("task 1..."))
.WithIdentity("task1", "group1")
.Build();
答案 1 :(得分:2)
我不知道Quartz.Net是否是实现您所寻找目标的正确工具。
使用它会很复杂。
我建议您切换到其他工具,例如FluentScheduler:
Install-Package FluentScheduler
然后你可以这样做:
class Program
{
static void Main(string[] args)
{
ScheduleAction(DateTime.UtcNow.AddSeconds(4), Action1, "A", "B");
ScheduleAction(DateTime.UtcNow.AddSeconds(8), Action1, "C", "D");
ScheduleAction(DateTime.UtcNow.AddSeconds(12), Action1, "E", "F");
Console.WriteLine("Running ...");
Console.ReadLine();
}
private static void ScheduleAction(DateTime runOnceAt, Action<string, string> action, string param1, string param2)
{
FluentScheduler.TaskManager.AddTask(() =>
{
action.Invoke(param1, param2);
}, x => x.WithName("MyTask").ToRunOnceAt(runOnceAt));
}
private static void Action1(string param1, string param2)
{
Console.WriteLine("Running Action 1 {0} - {1}", param1, param2);
}
private static void Action2(string param1, string param2)
{
Console.WriteLine("Running Action 2 {0} - {1}", param1, param2);
}
private static void Action3(string param1, string param2)
{
Console.WriteLine("Running Action 3 {0} - {1}", param1, param2);
}
}