在Quartz.net中安排一个动作

时间:2015-01-15 03:33:57

标签: c# .net quartz.net

我正在尝试学习Quartz.NET的细节,但是我没有取得很大的进展,我认为这是一项非常简单的任务。

我有一个接收Action和DateTime的方法,我只需要安排动作X在Y时刻运行。

这看起来很简单,但是JobBuilder.Create()需要一个实现IJob的类型参数......但是我没有丝毫知道我收到的动作是什么,直到我拥有它。我不能拥有一个定义良好的Execute(IJobExecutionContext context)方法的类,因为我在编译时没有那些信息。

我也无法改变我方法的签名。我得到一个Action和一个DateTime,这不是我的决定。

Quartz真的无法处理这个看似简单的任务吗?

2 个答案:

答案 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);
    }
}