当我使用 Quartz.net 在特定时间触发我的例程时,幻灯片放映不起作用

Slide show is not working when i use Quartz.net to fire my routine at specific time

这里我给出了一个小的代码片段,只是为了展示我正在努力实现的目标。

private void frmMain_Load(object sender, EventArgs e)
{
    // construct a scheduler factory
    ISchedulerFactory schedFact = new StdSchedulerFactory();

    // get a scheduler
    sched = schedFact.GetScheduler();
    sched.Start();

    IJobDetail job = JobBuilder.Create<frmMain>()
        .WithIdentity("Job", "group")
        .Build();

    ITrigger trigger = TriggerBuilder.Create()
       .WithDailyTimeIntervalSchedule
         (s =>
            s.WithIntervalInHours(24)
           .OnEveryDay()
           .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(01, 55))
         )
       .Build();

    sched.ScheduleJob(job, trigger);
}

public void Execute(IJobExecutionContext context)
{
    generate();
}

public void generate()
{
    if (this.FetchStart != null)
        this.FetchStart(this, new EventArgs());

    System.Threading.Thread.Sleep(5000);

    if (this.FetchDone != null)
        this.FetchDone(this, new EventArgs());
}

我已经用 VS2013 社区版完成了我的项目。我的 objective 是每天在特定时间调用幻灯片放映例程。当我在没有 quartz.net 调度程序的情况下调用我的幻灯片例程时,它工作正常,但是当我通过 quartz.net 调度程序调用我的例程时,例程被调用但没有显示幻灯片图像。

我不清楚发生了什么[问题。根据我的 objective,我必须使用 quartz.net 调度程序,因为我需要在每天的特定时间调用我的例程。

在这里我分享我的项目代码,因为它在 onedrive 中。所以我的请求请有人下载我的项目和 运行 在你的最后看到问题并告诉我导致不在图片框上显示图像的原因。

如果可能,请使用 quartz.net 调度程序代码纠正我的代码。一个驱动器项目 link 是 https://1drv.ms/f/s!AmIfMNV-CodPa81zFiNH6Ur7qro

我上传我的项目文件夹。

谢谢

更新

当我使用后台工作程序和 quartz.net 来调用我的生成例程时,我也没有发现任何改进。同样的问题,幻灯片图片没有出现在图片框上。

这里是 quartz.net 和后台工作人员

的代码
public partial class frmMain : Form, IJob
    {
        ucSlide oSlide = new ucSlide();
        IScheduler sched = null;
        BackgroundWorker m_oWorker = null;

        public event EventHandler FetchStart;
        public event EventHandler FetchDone;
        public event EventHandler NoDataFound;

        public frmMain()
        {
            InitializeComponent();

            m_oWorker = new BackgroundWorker();
            m_oWorker.DoWork += new DoWorkEventHandler(m_oWorker_DoWork);
            m_oWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(m_oWorker_RunWorkerCompleted);

            oSlide.MainForm = this;
            oSlide.SlideSource = Utility.SlidePath;

            this.Controls.Add(oSlide);
            oSlide.Dock = DockStyle.Fill;
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            // construct a scheduler factory
            ISchedulerFactory schedFact = new StdSchedulerFactory();

            // get a scheduler
            sched = schedFact.GetScheduler();
            sched.Start();

            IJobDetail job = JobBuilder.Create<frmMain>()
                .WithIdentity("Job", "group")
                .Build();

            ITrigger trigger = TriggerBuilder.Create()
               .WithDailyTimeIntervalSchedule
                 (s =>
                    s.WithIntervalInHours(24)
                   .OnEveryDay()
                   .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(02,23))
                 )
               .Build();

            sched.ScheduleJob(job, trigger);
        }

        public void Execute(IJobExecutionContext context)
        {
            m_oWorker.RunWorkerAsync();

        }

        public void generate()
        {
            if (this.FetchStart != null)
                this.FetchStart(this, new EventArgs());

            System.Threading.Thread.Sleep(5000);

            if (this.FetchDone != null)
                this.FetchDone(this, new EventArgs());
        }

        void m_oWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            generate();
        }

        void m_oWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            // The background process is complete. We need to inspect
            // our response to see if an error occurred, a cancel was
            // requested or if we completed successfully.  
            //if (e.Cancelled)
            //{
            //    //lblStatus.Text = "Task Cancelled.";
            //    isBusy = false;
            //}

            //// Check to see if an error occurred in the background process.

            //else if (e.Error != null)
            //{
            //    //lblStatus.Text = "Error while performing background operation.";
            //    MessageBox.Show(e.Error.InnerException.Message.ToString());
            //    isBusy = false;
            //}
            //else
            //{
            //    // Everything completed normally.
            //    //lblStatus.Text = "Task Completed...";
            //    isBusy = false;
            //}
        }
    }

谢谢

花了很多时间后,我找到了让我的代码正常工作的方法。

我必须通过这种方式安排我的表格参考。

    ISchedulerFactory schedFact = new StdSchedulerFactory();

    // get a scheduler
    sched = schedFact.GetScheduler();
    sched.Start();

    IJobDetail job = JobBuilder.Create<frmMain>()
        .WithIdentity("Job", "group")
        .Build();

    job.JobDataMap.Put("Form", this);

    ITrigger trigger = TriggerBuilder.Create()
       .WithDailyTimeIntervalSchedule
         (s =>
            s.WithIntervalInHours(24)
           .OnEveryDay()
           .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(20, 27))
         )
       .Build();

    sched.ScheduleJob(job, trigger);

主要技巧就在这里

job.JobDataMap.Put("Form", this);

public void Execute(IJobExecutionContext context)
{
    var dataMap = context.MergedJobDataMap;
    var frmInstance = (frmMain) dataMap["Form"];
    frmInstance.generate();
}

感谢@hillstuk,他的 link 是

我的完整代码幻灯片 quartz.net

using System;
using System.IO;
using System.Windows.Forms;
using Quartz;
using Quartz.Impl;
using System.Timers;

namespace SchedulerWithTimer
{
    public partial class frmMain : Form, IJob
    {
        private int imageNumber = 1, SlideCount = 0;
        string _SlideSource = "";
        System.Timers.Timer aTimer = new System.Timers.Timer();

        IScheduler sched = null;

        public frmMain()
        {
            InitializeComponent();
            _SlideSource = Utility.SlidePath;
            SlideCount = Directory.GetFiles(_SlideSource, "*", SearchOption.AllDirectories).Length;

            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            aTimer.Interval = 5000;

            aTimer.Enabled = false;
        }

        private void frmMain_Load(object sender, EventArgs e)
        {
            // construct a scheduler factory
            ISchedulerFactory schedFact = new StdSchedulerFactory();

            // get a scheduler
            sched = schedFact.GetScheduler();
            sched.Start();

            IJobDetail job = JobBuilder.Create<frmMain>()
                .WithIdentity("Job", "group")
                .Build();

            job.JobDataMap.Put("Form", this);

            ITrigger trigger = TriggerBuilder.Create()
               .WithDailyTimeIntervalSchedule
                 (s =>
                    s.WithIntervalInHours(24)
                   .OnEveryDay()
                   .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(20, 27))
                 )
               .Build();

            sched.ScheduleJob(job, trigger);
        }

        public void Execute(IJobExecutionContext context)
        {
            var dataMap = context.MergedJobDataMap;
            var frmInstance = (frmMain) dataMap["Form"];
            frmInstance.generate();
        }


        public void generate()
        {
            FetchStart();
            System.Threading.Thread.Sleep(5000);
            FetchDone();
        }

        public void FetchStart()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(delegate()
                {
                    aTimer.Enabled = false;
                    picSlide.SizeMode = PictureBoxSizeMode.CenterImage;
                    picSlide.Image = SchedulerWithTimer.Properties.Resources.loading;
                }));
            }
            else
            {
                aTimer.Enabled = false;
                picSlide.SizeMode = PictureBoxSizeMode.CenterImage;
                picSlide.Image = SchedulerWithTimer.Properties.Resources.loading;
            }

        }

        public void FetchDone()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(delegate()
                {
                    aTimer.Enabled = true;
                }));
            }
            else
                aTimer.Enabled = true;
        }


        private void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(delegate()
                {
                    loadNextImage();
                }));
            }
            else
                loadNextImage();
        }

        private void loadNextImage()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(delegate()
                {
                    if (imageNumber == SlideCount)
                    {
                        imageNumber = 1;
                    }
                    picSlide.SizeMode = PictureBoxSizeMode.Zoom;
                    picSlide.ImageLocation = string.Format(_SlideSource + @"\Slide{0}.jpg", imageNumber);

                }));
            }
            else
            {
                if (imageNumber == SlideCount)
                {
                    imageNumber = 1;
                }
                picSlide.SizeMode = PictureBoxSizeMode.Zoom;
                picSlide.ImageLocation = string.Format(_SlideSource + @"\Slide{0}.jpg", imageNumber);
                imageNumber++;
            }
        }
    }
}

可能有一天我的 post 可能会帮助其他人。谢谢大家:)