首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Quartz.net简单示例

Quartz.net简单示例
EN

Stack Overflow用户
提问于 2011-10-12 01:09:52
回答 1查看 35.5K关注 0票数 12

我正在尝试寻找一个简单的Quartz.Net示例,在该示例中,当单击按钮时,它将启动Quartz.Net功能。

我能够使用Quartz.Net示例(控制台应用程序)并更改一些内容来生成以下代码(SimpleExample.cs):

代码语言:javascript
复制
    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();

    }

但我有点困惑,因为点击一下按钮就会触发这种情况。我想我可以这样做:

代码语言:javascript
复制
    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表单一起工作的。似乎是一个完全不同的项目。

/

其他更改: 10/14/2011

我查看了建议的代码,并找到了下面与另一个(简单)示例的链接。http://simplequartzschedulerincsharp.blogspot.com/

我继续构建了一个简单的表单,并对作者的代码进行了一些更改,如下所示:

代码语言:javascript
复制
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
        {
        }    
    }
 }

我以前从来没有做过内部类,并且遇到了在内部引用文本框的问题。例如,我正在尝试执行以下操作:

代码语言:javascript
复制
      public void Execute(JobExecutionContext context)
        {
            DateTime now = DateTime.Now;
            this.textbox1 = Now.value;
            DoMoreWork();
        }

但我不能引用textbox。对于datagrid或toolStripStatusLabel,我也会遇到同样的问题。在上述代码中,访问textbox或toolStripStatusLabel等对象的最佳方式是什么?

EN

回答 1

Stack Overflow用户

发布于 2011-10-12 02:25:55

你可以这样做:

代码语言:javascript
复制
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);
    }
}

我不清楚您是想让按钮启动调度程序还是启动作业,所以我为这两个按钮都添加了一个按钮。关键在于,您希望通过单击按钮来启动调度程序,而不是将其初始化。初始化它的最简单位置是在窗体的构造函数中。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7729807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档