ボタンがクリックされると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....
}
しかし、それはうまくいきませんでした。
次のWebサイトを確認しましたが、ボタンのクリックから開始することに関して、すべてが役に立ったわけではありません。
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フォームを使用します。まったく別のプロジェクトのようです。
/////
追加の変更:2011年10月14日
提案されたコードを確認したところ、別の(単純な)例を含む次のリンクが見つかりました。 http://simplequartzschedulerincsharp.blogspot.com/
私は先に進み、次のように作成者のコードにいくつかの変更を加えた単純なフォームを作成しました。
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();
}
しかし、テキストボックスを参照することはできません。 datagridまたはtoolStripStatusLabelでも同じ問題が発生します。上記のコードでテキストボックスやtoolStripStatusLabelなどのオブジェクトにアクセスするための最良の方法は何ですか?
あなたはこのようなことをすることができます:
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);
}
}
ボタンでスケジューラーを開始するのか、ジョブを開始するのかがはっきりしなかったので、両方のボタンを追加しました。重要なのは、ボタンのクリックでスケジューラーを開始するのとは別に、スケジューラーを初期化することです。初期化する最も簡単な場所は、フォームのコンストラクターです。