当我使用 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 可能会帮助其他人。谢谢大家:)
这里我给出了一个小的代码片段,只是为了展示我正在努力实现的目标。
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 可能会帮助其他人。谢谢大家:)