/// <summary>
/// 定时任务(计时器)管理类
/// </summary>
public class TimeManager
{
private static TimeManager instance = null;
public static TimeManager Instance
{
get
{
lock (instance)
{
if (instance == null)
instance = new TimeManager();
return instance;
}
}
}
/// <summary>
/// 实现定时器的主要功能就是这个Timer类
/// </summary>
private Timer timer;
/// <summary>
/// 存储 任务id 和 任务模型 的映射
/// </summary>
private ConcurrentDictionary<int, TimeModel> idModelDict = new ConcurrentDictionary<int, TimeModel>();
/// <summary>
/// 要移除的任务ID列表
/// </summary>
private List<int> removeList = new List<int>();
/// <summary>
/// 用来表示ID
/// </summary>
private ConcurrentInt id = new ConcurrentInt(-1);
public TimeManager()
{
timer = new Timer(10);
timer.Elapsed += timer_Elapsed;
}
/// <summary>
/// 达到时间间隔时触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
lock (removeList)
{
TimeModel tmpTimer = null;
foreach (var id in removeList)
{
idModelDict.TryRemove(id,out tmpTimer);
}
removeList.Clear();
}
foreach (var model in idModelDict.Values)
{
if (model.Time <= DateTime.Now.Ticks)
model.Run();
}
}
/// <summary>
/// 设置定时任务 指定触发的时间
/// </summary>
/// <param name="dateTime"></param>
/// <param name="timeDelegate"></param>
public void AddTimerEvent(DateTime dateTime, TimerDelegate timeDelegate)
{
long delayTime = dateTime.Ticks - DateTime.Now.Ticks;
if (delayTime <= 0)
return;
AddTimerEvent(delayTime, timeDelegate);
}
/// <summary>
/// 添加定时任务 指定延迟的时间
/// </summary>
/// <param name="delayTime">毫秒</param>
/// <param name="timerDelegate"></param>
public void AddTimerEvent(long delayTime,TimerDelegate timeDelegate)
{
TimeModel model = new TimeModel(id.Add_Get(),DateTime.Now.Ticks+delayTime,timeDelegate);
idModelDict.TryAdd(model.Id, model);
}
}
/// <summary>
/// 定时器达到时间时触发
/// </summary>
public delegate void TimerDelegate();
/// <summary>
/// 定时器任务的数据模型
/// </summary>
public class TimeModel
{
public int Id;
/// <summary>
/// 任务执行的时间
/// </summary>
public long Time;
public TimerDelegate timeDelegate;
public TimeModel(int id,long time,TimerDelegate td)
{
this.Id = id;
this.Time = time;
this.timeDelegate = td;
}
/// <summary>
/// 触发任务
/// </summary>
public void Run()
{
timeDelegate();
}
}