-1

here i am giving a small my code snippet just to show what i am trying to achieve.

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());
}

i have done my project with VS2013 community edition. my objective is to call slide show routine every day at specific time. when i am calling my slide show routine without quartz.net scheduler then it is working fine but when i invoke my routine by quartz.net scheduler then routine is getting called but no slide show image is showing.

what [problem occur is not clear to me. as per my objective i have to use quartz.net scheduler because i need to invoke my routine at a specific time of day every day.

here i am sharing my project code because it is in onedrive. so my request please some one download my project and run at your end to see the problem and tell me the reason which causes not to show images on picture box.

if possible please rectify my code with quartz.net scheduler code. one drive project link is https://1drv.ms/f/s!AmIfMNV-CodPa81zFiNH6Ur7qro

i upload my project folder.

thanks

UPDATE

when i use background worker along with quartz.net to call my generate routine then also no improvement i found. same problem that slide show image is not appearing on picture box.

here is the code for quartz.net with background worker

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;
            //}
        }
    }

thanks

Mou
  • 15,673
  • 43
  • 156
  • 275
  • quartz.net call automatically Execute method – Mou Feb 22 '17 at 21:15
  • http://www.shujaat.net/2013/06/enterprise-scheduling-using-quartznet.html – Mou Feb 22 '17 at 21:18
  • My guess is this is a problem: `IJobDetail job = JobBuilder.Create` since quartz.net is *probably* creating a new instance of frmMain, and is not referring to the active form. – LarsTech Feb 22 '17 at 21:18
  • please some one suggest how to fix my problem. here i share url of my project so anyone can download and run at your end to see actual problem. – Mou Feb 23 '17 at 08:38

1 Answers1

-1

after spending lots of hour i found out the way to get my code work.

i have to pass my form reference with scheduled this way.

    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);

the main trick lies here

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

AND

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

all thanks goes to @hillstuk and his link is https://stackoverflow.com/a/25660846/728750

my full code slide show with 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++;
            }
        }
    }
}

may be some day my post may help other. thanks all :)

Community
  • 1
  • 1
Mou
  • 15,673
  • 43
  • 156
  • 275