当我使用Quartz.net在特定时间发射我的日常工作时,幻灯片节目无法正常工作



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

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社区版的项目。我的目标是每天在特定时间致电幻灯片节目例程。当我在没有Quartz.net调度程序的情况下调用幻灯片显示例程时,它可以正常工作,但是当我通过Quartz.net调度程序调用例程时,请调用例程,但是没有幻灯片显示图像显示。

>

我尚不清楚发生什么问题。根据我的目标,我必须使用Quartz.net调度程序,因为我需要每天在一天的特定时间调用我的日常工作。

在这里,我正在共享我的项目代码,因为它在OneDrive中。因此,我的要求请有人下载我的项目,并在您的尽头跑步以查看问题,并告诉我原因导致不在图片框中显示图像的原因。

如果可能的话,请使用Quartz.net调度程序代码纠正我的代码。一个驱动器项目链接是https://1drv.ms/f/s!mifmnv-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,他的链接是https://stackoverflow.com/a/25660846/728750

我的完整代码幻灯片显示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++;
            }
        }
    }
}

可能有一天我的帖子可能会对其他人有所帮助。谢谢所有:)

最新更新