在这里,我给一个小我的代码片段只是为了展示我要实现的目标。
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++;
}
}
}
}
可能有一天我的帖子可能会对其他人有所帮助。谢谢所有:)