using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Timers; using Autofac; using CommonClass.Factory; namespace CmdjyHisFront.Bll { public interface ITask { void Run(); } /// /// 任务管理器 /// public interface ITaskManager { /// /// 心跳间隔。毫秒 /// double BackgroundTaskHeartbeat { get; set; } /// /// 执行任务 /// void Start(); /// /// 结束任务 /// void Stop(); } /// /// 背景任务注册管理器 /// public class TaskManagerRegister:IRegister { public void Register(ContainerBuilder builder) { builder.Register(c => new TaskManager()); } } /// /// 背景任务管理器 /// public class TaskManager:ITaskManager { /// /// 任务心跳触发计时器 /// public static Timer CTimer { get; private set; } /// /// 要执行的背景线程 /// public IEnumerable BackTasks { get; set; } public double BackgroundTaskHeartbeat { get; set; } = 1000; /// /// 创建一个背景任务管理器 /// public TaskManager() { } /// /// 通过提供任务和背景心跳间隔创建背景任务管理器 /// /// 背景任务枚举 /// 心跳 public TaskManager(IEnumerable bt) { this.BackTasks = bt; } /// /// 通过提供任务和背景心跳间隔创建背景任务管理器 /// /// 背景任务枚举 /// 心跳 public TaskManager(IEnumerable bt,double bh) { this.BackTasks = bt; this.BackgroundTaskHeartbeat = bh; } /// /// 开始执行背景任务 /// public void Start() { if(this.BackTasks == null || this.BackTasks.Count() == 0) return; CTimer = CTimer ?? new Timer(this.BackgroundTaskHeartbeat); CTimer.Elapsed += this.run; CTimer.AutoReset = false; CTimer.Start(); } /// /// 任务处理事件 /// private void run(object sender,ElapsedEventArgs e) { //启动具体任务 foreach(var t in this.BackTasks) { Task.Factory.StartNew(m => { if(m is ITask task) { task.Run(); } },t as object); } //任务启动后重启心跳计时器 if(sender is Timer timer) { timer.Start(); } } public void Stop() { if(CTimer == null) return; CTimer.Stop(); CTimer.Elapsed -= run; CTimer = null; } } }