Quartz.net Простой пример

Я пытаюсь найти простой пример Quartz.Net, в котором при нажатии кнопки запускается функциональность Quartz.Net.

Я смог взять пример Quartz.Net (консольное приложение) и изменить некоторые вещи, чтобы получить это (SimpleExample.cs):

    public virtual void Run()
    {
        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sched = sf.GetScheduler();

        DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTime.UtcNow);
        DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 10);

        IJobDetail job = JobBuilder.Create<HelloJob>()
            .WithIdentity("job1", "group1")
            .Build();
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .StartAt(runTime)
            .WithCronSchedule("5 0/1 * * * ?")
            .Build();

        sched.ScheduleJob(job, trigger);

        sched.Start();

    }

Но я немного смущен тем, как это вызывается нажатием кнопки. Я думал, что могу сделать что-то вроде этого:

    private void button1_Click(object sender, EventArgs e)
    {
     code here....
    }

Но это не сработало.

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

http://www.mkyong.com/java/quartz-scheduler-example/ - Java, поэтому мне трудно понять разницу (я новичок во всем этом!).

http://www.hardcodet.net/2010/01/lightweight-task-slash-job-scheduling-with-silverlight-support — это было полезно, но мне непонятно, как Silverlight работает с обычной формой .Net. Кажется, это совсем другой проект.

/////

Дополнительные изменения: 14.10.2011

Я просмотрел предложенный код и нашел следующую ссылку с другим (простым) примером. http://simplequartzschedulerincsharp.blogspot.co.uk/

Я пошел дальше и построил простую форму с несколькими изменениями в авторском коде следующим образом:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Quartz;
using Quartz.Impl;

//http://simplequartzschedulerincsharp.blogspot.com/

namespace QuartzExampleWF
{
    public partial class Form1 : Form
    {
        private static IScheduler _scheduler;

        public Form1()
        {
            InitializeComponent();

            ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
            _scheduler = schedulerFactory.GetScheduler();

            AddJob();
        }
        public static void AddJob()
        {
            IMyJob myJob = new MyJob();
            JobDetail jobDetail = new JobDetail("Job1", "Group1", myJob.GetType());
            CronTrigger trigger = new CronTrigger("Trigger1", "Group1", "5 0/1 * * * ?");
            _scheduler.ScheduleJob(jobDetail, trigger);
            DateTime? nextFireTime = trigger.GetNextFireTimeUtc();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            _scheduler.Start();

        }

        internal class MyJob : IMyJob
        {
            public void Execute(JobExecutionContext context)
            {
                DateTime now = DateTime.Now;

                DoMoreWork();
            }

            public void DoMoreWork()
            {
                //more code...
            }
        }
        internal interface IMyJob : IJob
        {
        }    
    }
 }

Я никогда раньше не делал внутренний класс и сталкивался с проблемой ссылки на текстовое поле внутри. Например, я пытаюсь сделать следующее:

      public void Execute(JobExecutionContext context)
        {
            DateTime now = DateTime.Now;
            this.textbox1 = Now.value;
            DoMoreWork();
        }

Но я не могу ссылаться на текстовое поле. У меня была бы такая же проблема с сеткой данных или toolStripStatusLabel. Каков наилучший способ доступа к таким объектам, как текстовое поле или toolStripStatusLabel, в приведенном выше коде?


person JAS    schedule 11.10.2011    source источник
comment
sched должен быть переменной, доступной в событии клика. В соответствии с тем, как вы закодировали метод запуска, планировщик будет недоступен, как только метод запуска завершится.   -  person jvilalta    schedule 13.10.2011
comment
Только что нашел очень полезные уроки Quartz.NET: quartznet.sourceforge.net/ учебник/lesson_1.html   -  person hfrmobile    schedule 04.09.2012
comment
очень жаль, что эти примеры устарели. Ни один из классов из прошлой версии не работает с новым с сайта.   -  person radu florescu    schedule 08.08.2013


Ответы (1)


Вы можете сделать что-то вроде этого:

public partial class MainForm : Form
{
    IScheduler sched;
    IJobDetail job;

    public MainForm()
    {
        InitializeComponent();

        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sched = sf.GetScheduler();

        DateTimeOffset runTime = DateBuilder.EvenMinuteDate(DateTime.UtcNow);
        DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(null, 10);

        job = JobBuilder.Create<HelloJob>()
            .WithIdentity("job1", "group1")
            .Build();
        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("trigger1", "group1")
            .StartAt(runTime)
            .WithCronSchedule("5 0/1 * * * ?")
            .Build();

        sched.ScheduleJob(job, trigger);
    }

    private void startScheduler_Click(object sender, EventArgs e)
    {
        sched.Start();
    }

    private void startJob_Click(object sender, EventArgs e)
    {
        sched.TriggerJob(job.Name, job.Group);
    }
}

Мне было неясно, нужна ли вам кнопка для запуска планировщика или для запуска задания, поэтому я добавил кнопку для обоих. Суть в том, что вы хотите инициализировать планировщик отдельно от его запуска нажатием кнопки. Проще всего инициализировать его в конструкторе формы.

person Jason Smale    schedule 11.10.2011
comment
Спасибо, что поделились этим кодом. startTime никогда не используется? Quartz.NET 2.0.1: _scheduler.TriggerJob(_jobDetail.Key); - person hfrmobile; 04.09.2012
comment
@hfrmobile Время начала используется для определения того, когда может быть самое раннее срабатывание. Например, это 16 декабря 2013 года. Если у вас есть расписание на каждый день в 9 утра, но вы установили время начала на 1 января 2014 года, то первое срабатывание произойдет не раньше 1 января, даже если триггер включен. и работа назначена. - person saluce; 16.12.2013
comment
Когда я попытался это сделать, если я снова нажму кнопку, я получу Quartz.JobPersistenceException, и если я проверю, существует ли Job в планировщике, он скажет, что его нет. TriggerJob каким-то образом удаляет задание из IScheduler? - person njkremer; 11.03.2014
comment
Ничего, я нашел ответ. Мой Job больше не был запланирован. Я не читал часть Job Durability. Долговечность — если задание непродолжительно, оно автоматически удаляется из планировщика, как только с ним больше не связаны активные триггеры. Другими словами, продолжительность жизни краткосрочной работы ограничена наличием ее триггеров. из quartz-scheduler.org/documentation/quartz-2 .x/учебники/ - person njkremer; 11.03.2014