2017-01-18 7 views
2

Возможно ли создать работу из лямбда в 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, и это делает вещи труднее, чем они должны быть.

Любые идеи о том, как это сделать?

+1

, кстати, '() => Foo()', что эквивалентно просто писать 'Foo'. Скобки скорректированы –

+1

@Natan В Quartz.Net такой вещи нет, вам нужно написать ее самостоятельно. Может быть, [JobFactory] (http://www.quartz-scheduler.net/documentation/quartz-3.x/tutorial/miscellaneous-features.html) может помочь вам в этом. – Rabban

ответ

3

Хорошо, мне не хватало данных для параметров. Я был в состоянии сделать это с помощью следующего кода, если кто-то нуждается в нем:

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(); 
      } 
     } 
    } 
} 
+0

Привет, У меня проблема с этим кодом. http://prntscr.com/e8wbhn; Я пытаюсь вызвать ForceScheduledCheck() один раз в день одновременно. Но работа не запускается в нужное время. Есть идеи? – Andrew

0

написал небольшую библиотеку Удлинитель, которая позволяет подать в суд синтаксис лямбда.

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); 

NuGet: https://www.nuget.org/packages/Quartz.Lambda/

Github: https://github.com/midianok/Quartz.Lambda/

 Смежные вопросы

  • Нет связанных вопросов^_^