using System; using FluentScheduler; using System.Web.Hosting; using AUTS.Log4Net; namespace AUTS.SystemTask { #region PlanJobBase 对IIS回收做处理 internal abstract class JobBase : IJob, IRegisteredObject { /// /// 锁 /// private readonly object _lock = new object(); /// /// 是否已经在回收中 /// private bool _shuttingDown; /// /// 初始化注册 /// public JobBase() { HostingEnvironment.RegisterObject(this); } /// /// 重写执行代码方法继承 /// public abstract void Plan(); /// /// 重写执行 /// public void Execute() { try { lock (_lock) { if (_shuttingDown) return; Plan();//执行任务 } } finally { HostingEnvironment.UnregisterObject(this); } } /// /// 重写执行代码方法继承 带参数 /// public virtual void Plan(params object[] obj) { } /// /// 重写执行 带参数 /// public void Execute(params object[] obj) { try { lock (_lock) { if (_shuttingDown) return; Plan(obj);//执行任务 } } finally { HostingEnvironment.UnregisterObject(this); } } /// /// 回收调用 /// /// public void Stop(bool immediate) { JobManager.RemoveAllJobs();//移除所有定时计划,防止秒级定时计划堆叠执行 Log4NetHelper.Log("调用stop:" + DateTime.Now); lock (_lock) { Log4NetHelper.Log("lock结束:" + DateTime.Now); _shuttingDown = true; } HostingEnvironment.UnregisterObject(this); } } #endregion }