C# WINFORM的定时作业 sleep和Quartz区别(Quartz并不好用)

被刻印的时光 ゝ 提交于 2020-03-04 15:45:08

程序需要实现定时作业的功能经常会遇到,之前我一直使用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定时作业表达式,对天,月,星期设置有确实。

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!