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 进行数据库持久化时,需要保证数据库连接可靠和高效,同时需要考虑并发执行的问题。可以适当地调整作业和触发器的参数,以达到最优的性能和可靠性。
稍微整理一下自己遇到的結論 : 1 表單提交的時候 post 驗證有誤,觸發 return view() 2 渲染 view 的時候,這時候沒給 viewbag 或 viewdata 給值 3 @html 檢查到空無一物的時候抱錯 post的action 也要給 viewbag 或 viewdata值 类型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: