public event EventHandler DoWork;
static object lockObj = new object();
public void Execute(Quartz.JobExecutionContext context)
string name = context.JobDetail.Name;
if (QuartzWorker.workCache[name])
EventLog.Log(DoWork.Target.GetType() + " 没运行完又自动触发,被忽略", "info");
return;
QuartzWorker.workCache[name] = true;
DoWork(null, null);
catch (Exception ero)
EventLog.Log(DoWork.Target.GetType() + " 执行出错:" + ero, true);
QuartzWorker.workCache[name] = false;
第二个QuartzWorker.cs 源码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Quartz;
using Quartz.Impl;
namespace SXF.Utils.QuartzScheduler
/// <summary>
/// QuartzWorker自动任务
/// </summary>
public class QuartzWorker
IScheduler scheduler;
public QuartzWorker()
// 创建一个工作调度器工场
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
// 获取一个任务调度器
scheduler = schedulerFactory.GetScheduler();
public static Dictionary<string, bool> workCache = new Dictionary<string, bool>();
/// <summary>
/// 添加一个任务
/// </summary>
/// <param name="job"></param>
public void AddWork(QuartzJob job)
Type type = job.GetType();
// 创建一个工作
string jobName = "JobName_" + type;
string jobGroup = "JobGroup_" + type;
JobDetail jobDetail = new JobDetail(jobName, jobGroup, type);
// 创建一个触发器
Trigger trigger;
//使用Cron表达式
if (!string.IsNullOrEmpty(job.CronExpression))
CronTrigger cronTrigger = new CronTrigger();
cronTrigger.CronExpression = new CronExpression(job.CronExpression);
trigger = cronTrigger;
else//指定间隔次数
if (job.RepeatInterval.TotalSeconds == 0)
throw new Exception("job.RepeatInterval为0");
if (job.RepeatCount == 0)
throw new Exception("job.RepeatCount为0");
SimpleTrigger simpleTrigger = new SimpleTrigger();
simpleTrigger.RepeatInterval = job.RepeatInterval;
simpleTrigger.RepeatCount = job.RepeatCount;
trigger = simpleTrigger;
trigger.Name = "trigger" + jobName;
trigger.JobName = jobName;
trigger.JobGroup = jobGroup;
trigger.Group = "triggergroup" + jobName;
scheduler.AddJob(jobDetail, true);
DateTime ft = scheduler.ScheduleJob(trigger);
workCache.Add(jobDetail.Name, false);
/// <summary>
/// 开始运行
/// </summary>
public void Start()
scheduler.Start();
EventLog.Info("QuartzWorker已启动");
/// <summary>
/// 停止运行
/// </summary>
public void Stop()
scheduler.Shutdown(true);
EventLog.Info("QuartzWorker已停止");
引用的Quartz.dll是1.0版本的。
global.asax中调用方法:
static QuartzWorker worker;
protected void Application_Start(Object sender, EventArgs e)
worker = new QuartzWorker();
NewsUpdateWork newsWork = new NewsUpdateWork();
worker.AddWork(newsWork);
worker.Start();
protected void Application_End(Object sender, EventArgs e)
//在应用程序关闭时运行的代码
if (worker != null)
worker.Stop();
newsupdatework.cs的写法:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SXF.Utils;
using SXF.Utils.QuartzScheduler;
namespace xxx.Facade.Task
/// <summary>
/// news表当isupdate=0时,自动重新生成新闻静态页面
/// </summary>
public class NewsUpdateWork : QuartzJob
public NewsUpdateWork()
//CronExpression = "0 0/1 * * * ?";
//每天21点-24点,0点-7点,每隔5分钟执行一次
//CronExpression = "0 0/5 18-23,0-9 * * ?";
CronExpression = "0 0/5 * * * ?";
RepeatInterval = new TimeSpan(0, 0, 0);
RepeatCount = 0;
DoWork += new EventHandler(this_DoWork);
public void this_DoWork(object sender, EventArgs e)
//这里写你要处理的定时任务
有两个cs文件。第一个QuartzJob.cs 源码:using System;using System.Collections.Generic;using System.Linq;using System.Text;using Quartz;namespace SXF.Utils.QuartzScheduler{ /// /// 任务接口 ///
Topshelf+Quatz.Net的简单使用
一 Topshelf概述
Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的介绍使用使用Topshelf创建Windows 服务。Topshelf是一个开源的跨平台的宿主服务框架,支持Windows和Mono,只需要几行代码就可以构建一个很方便使用的服务宿主。
二 Topshelf使用
1 新建Ti...
Quartz.NET的触发器比较多,但是常用的有两个分别是SimpleTrigger和CronTrigger,本篇学习下SimpleTrigger
SimpleTrigger 的创建方式如下:
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
需求:体检系统需要获取DR影像系统的结果写定时器定时获取结果
首先添加Quartz包,的环境是4.5只能用3.0.7这个版本的包。满足依赖项的可以用最新的包。
之后配置Global.asax文件 和 Web.config 文件 再加个文件夹保存 设置和执行的类
<section name="quartz" type="System.Configuration.NameValueSectionHandler" />
@定时任务设置类
using Interface.Quartz;
任务调度器:Scheduler,来自于Scheduler工厂,其会自动加载持久层的任务数据并等待启动。注意任务调度器关闭后不能重启,所以任务调度器应在进程关闭时调用。
任务:job,任务可以有多个触发器在,也就是任务可以有多个出发时间点。job停止会停止多触发器下的所有该job。
触发器:Trigger,用来设置时间,作...
在 C# 中,可以使用 Quartz.NET 来实现定时任务,同时支持数据库持久化。Quartz.NET 是一个功能强大且灵活的开源作业调度库,可以用于创建定时任务和计划任务,支持数据库持久化和集群部署等高级功能。
要使用 Quartz.NET 实现数据库持久化,需要先创建一个用于存储调度程序数据的数据库表,可以使用 Quartz.NET 提供的 SQL 脚本来创建表。然后在应用程序中配置 Quartz.NET,指定数据库类型和连接字符串等信息。示例如下:
```csharp
using Quartz;
using Quartz.Impl;
using Quartz.Impl.AdoJobStore;
using Quartz.Spi;
using System;
using System.Collections.Specialized;
class Program
static void Main()
Console.WriteLine("Starting scheduler...");
// 创建一个调度程序实例
ISchedulerFactory schedulerFactory = new StdSchedulerFactory(GetSchedulerProperties());
IScheduler scheduler = schedulerFactory.GetScheduler().Result;
// 启动调度程序
scheduler.Start();
Console.WriteLine("Scheduler started.");
// 创建一个作业实例
IJobDetail job = JobBuilder.Create<HelloJob>()
.WithIdentity("job1", "group1")
.Build();
// 创建一个触发器实例,每秒钟触发一次
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(1)
.RepeatForever())
.Build();
// 将作业和触发器添加到调度程序中
scheduler.ScheduleJob(job, trigger);
// 等待用户按下 Enter 键退出
Console.ReadLine();
// 关闭调度程序
scheduler.Shutdown();
Console.WriteLine("Scheduler stopped.");
static NameValueCollection GetSchedulerProperties()
// 配置调度程序属性,指定数据库持久化和相关参数
NameValueCollection properties = new NameValueCollection();
properties["quartz.scheduler.instanceName"] = "MyScheduler";
properties["quartz.scheduler.instanceId"] = "AUTO";
properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz";
properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.SqlServerDelegate, Quartz";
properties["quartz.jobStore.dataSource"] = "default";
properties["quartz.dataSource.default.provider"] = "SqlServer-20";
properties["quartz.dataSource.default.connectionString"] = "Server=(local);Database=Quartz;Trusted_Connection=True;";
return properties;
public class HelloJob : IJob
public void Execute(IJobExecutionContext context)
Console.WriteLine("Hello, Quartz.NET!");
这个示例会创建一个调度程序实例,然后创建一个作业实例和触发器实例,并将它们添加到调度程序中。作业类 HelloJob 实现了 IJob 接口,用于定义作业执行的逻辑。在 GetSchedulerProperties 方法中,配置了调度程序属性,指定了数据库类型和连接字符串等信息。在这个示例中,使用的是 SQL Server 数据库。
需要注意的是,在使用 Quartz.NET 进行数据库持久化时,需要保证数据库连接可靠和高效,同时需要考虑并发执行的问题。可以适当地调整作业和触发器的参数,以达到最优的性能和可靠性。
类型ASP._Page_Areas_Wechat__ViewStart_cshtml不从System.Web.WebPages.StartPage继承
qq_33261918:
类型ASP._Page_Areas_Wechat__ViewStart_cshtml不从System.Web.WebPages.StartPage继承
qq_33261918:
vscode高亮选中单词的颜色
799050408: