程序需要实现定时作业的功能经常会遇到,之前我一直使用Sleep,今天我突然觉得C# 应该有简单的定时作业类可以使用吧,于是我百度了一把,果然有一个Quartz,但是使用后发现只能加载静态类代码,其实很不灵活。
一、C# WINFORM 中使用Quartz的例子代码:
1、VS2019创建一个WINFROM项目,NuGit管理器中直接安装Quartz。
2、加入下面的代码, 我专门为Quartz启动了一个线程m2:
1) Quartz的实现要建一个工厂factory,
2)建一个定时作业scheduler
3)加入一个工作项目job
4)加入一个触发条件trigger
5)最后执行就好。
注意这行代码:
IJobDetail job = JobBuilder.Create<JobDemo>().Build();
这个尖括号<>里面需要用到一个类,为此我们还要专门提供这个类 public class JobDemo:IJob,并在代码中加入定时执行的作业,这非常的不科学,静态的类不够灵活,很难访问instance中的全局变量,所以定时作业的使用会有很大的限制。虽然代码还是实现了5秒提示一个消息窗口,但是我准备不用Quartz。
using Quartz;
using Quartz.Impl;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//线程,为定时作业用
Control.CheckForIllegalCrossThreadCalls = false;
Thread m1Thread = new Thread(new ThreadStart(m1));
m1Thread.IsBackground = true;
m1Thread.Start();
//线程,为定时作业用
Thread jobthread = new Thread(new ThreadStart(m2));
jobthread.IsBackground = true;
jobthread.Start();
}
public class JobDemo:IJob
{
public Task Execute(IJobExecutionContext context)
{
MessageBox.Show("11111");
return null;
}
}
private async void m2()
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = await factory.GetScheduler();
IJobDetail job = JobBuilder.Create<JobDemo>().Build();
ITrigger trigger = TriggerBuilder.Create().WithCronSchedule("*/5 * * ? * *").Build();
await scheduler.ScheduleJob(job, trigger);
await scheduler.Start();
}
private void m1()
{
while (true)
{
Thread.Sleep(10 * 1000); //10秒对比一次系统时间
string now = System.DateTime.Now.ToShortTimeString(); //得到现在的时间
if (now.Equals("23:50")) //时间点格式 01:12
{
toolStripButton1.PerformClick();
toolStripButton2.PerformClick();
toolStripButton3.PerformClick();
Thread.Sleep(1000 * 60);//延迟一分钟,避免一分钟内发多次
}
}
}
二、使用线程中的Thread.Sleep来设计定时作业
如上面代码的线程m1,功能和代码更简单,每10秒检查一下时间点,如果到了设定时间点(分钟),就执行定时作业,为防止在分钟时间点多次执行,作业执行后,还要睡一分钟再干活。当然sleep没有cron定时作业表达式,对天,月,星期设置有确实。
来源:CSDN
作者:james-lx
链接:https://blog.csdn.net/ot512csdn/article/details/104649846