You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
5.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.Linq;
using HuizhongLibrary.Log;
namespace HuizhongLibrary
{
public class TimeTask
{
public List<TaskModel> ListModel = new List<TaskModel>();
private AutoResetEvent AutoReset = new AutoResetEvent(false);
public int TimeType = 1; //0秒1分钟
bool IsRun = false;
TaskModel cTask = null; //当前任务
#region 启动任务
public void Start()
{
cTask = null;
if (ListModel.Count == 0) return;
DateTime dt=DateTime.Now;
foreach (var item in ListModel)
{
if (item.NextTime < dt)
{
if (TimeType == 0) item.NextTime = item.NextTime.AddSeconds(item.Interval);
if (TimeType == 1) item.NextTime = item.NextTime.AddMinutes(item.Interval);
}
}
Thread t1 = new Thread(new ThreadStart(this.OnStart));
t1.Name = "定时任务";
t1.Start();
}
#endregion
#region 停止任务
public void Stop()
{
IsRun = false;
AutoReset.Set();
}
#endregion
#region 计算下一个任务
public void MathNextTask()
{
if (cTask != null)
{
if (cTask.Interval == 0)
{
ListModel.Remove(cTask);
if (ListModel.Count == 0)
{
cTask = null;
Stop();
return;
}
if (ListModel.Count == 1) cTask = ListModel[0];
return;
}
else
{
if (TimeType==0) cTask.NextTime = cTask.NextTime.AddSeconds(cTask.Interval);
if (TimeType == 1) cTask.NextTime = cTask.NextTime.AddMinutes(cTask.Interval);
}
//ErrorFollow.TraceWrite("下次执行任务时间", "", cTask.NextTime.ToString("yyyy-MM-dd HH:mm:00"));
}
if (ListModel.Count == 1)
{
if (cTask==null) cTask = ListModel[0];
return;
}
var query = from item in ListModel
orderby item.NextTime ascending
select item;
cTask = query.First();
//foreach (TaskModel item in ListModel)
//{
// if (cTask == null) { cTask = item; }
// else
// {
// if (item.NextTime < cTask.NextTime) cTask = item;
// }
//}
}
#endregion
#region 睡眠
public void WaitOne()
{
if (cTask == null) return;
if (cTask.NextTime < DateTime.Now)
{
if (TimeType == 0) cTask.NextTime = cTask.NextTime.AddSeconds(cTask.Interval);
if (TimeType == 1) cTask.NextTime = cTask.NextTime.AddMinutes(cTask.Interval);
}
TimeSpan ts =cTask.NextTime - DateTime.Now;
ErrorFollow.TraceWrite("定时", "", "下次运行时间:" + cTask.NextTime.ToString("MM-dd HH:mm:ss"));
if (IsRun == true && ts.TotalSeconds>0) AutoReset.WaitOne(ts, false);
}
#endregion
#region 执行任务
void OnStart()
{
IsRun = true;
ErrorFollow.TraceWrite("启动定时", "", "计算时间");
MathNextTask();
ErrorFollow.TraceWrite("启动定时", "", "下次运行时间:"+cTask.NextTime.ToString("MM-dd HH:mm:ss"));
WaitOne();
if (ListModel.Count == 0) { ErrorFollow.TraceWrite("停止定时", "", cTask.NextTime.ToString("MM-dd HH:mm:ss")); return; }
if (IsRun == false) { ErrorFollow.TraceWrite("停止定时", "", cTask.NextTime.ToString("MM-dd HH:mm:ss")); return; }
while (IsRun)
{
cTask.RunTask.Invoke(cTask);
MathNextTask();
WaitOne();
if (ListModel.Count == 0) { ErrorFollow.TraceWrite("停止定时", "", cTask.NextTime.ToString("MM-dd HH:mm:ss")); return; }
if (IsRun == false) { ErrorFollow.TraceWrite("停止定时", "", cTask.NextTime.ToString("MM-dd HH:mm:ss")); return; }
}
}
#endregion
#region 关机
public void CloseWindows(DateTime dt)
{
IsRun = true;
Action<DateTime> hand = new Action<DateTime>(this.CloseWindows_Action);
hand.BeginInvoke(dt, null, null);
}
void CloseWindows_Action(DateTime dt)
{
TimeSpan ts = dt - DateTime.Now;
if (ts.TotalSeconds < 1) return;
AutoReset.WaitOne(ts, true);
if (IsRun == false) return;
SystemInfo.CloseWindows();
}
#endregion
}
public class TaskModel
{
public Action<TaskModel> RunTask = null;
public DateTime NextTime = DateTime.Today;
/// <summary>
/// 间隔时间(分钟)
/// </summary>
public int Interval = 0;
public object CustomModel = null;
}
}