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;
}
}
}