声明:此段程序是在其他人博客里拷贝过来的,现在有些疑问希望大家给点提示,第一次做,很生疏!using System;
using System.Collections;
using System.Threading;
namespace POSTiming
{
#region 任务计划接口和一些标准实现
/// <summary>
/// 计划的接口
/// </summary>
public interface ISchedule
{
/// <summary>
/// 返回最初计划执行时间
/// </summary>
DateTime ExecutionTime
{
get;
set;
}
/// <summary>
/// 初始化执行时间于现在时间的时间刻度差
/// </summary>
long DueTime
{
get;
}
/// <summary>
/// 循环的周期
/// </summary>
long Period
{
get;
} }
/// <summary>
/// 计划立即执行任务
/// </summary>
public class ImmediateExecution : ISchedule
{
#region ISchedule 成员
public DateTime ExecutionTime
{
get
{
// TODO: 添加 ImmediatelyShedule.ExecutionTime getter 实现
return DateTime.Now;
}
set
{
;
}
}
public long DueTime
{
get
{
return 0;
}
}
public long Period
{
get
{
// TODO: 添加 ImmediatelyShedule.Period getter 实现
return Timeout.Infinite;
}
}
#endregion
}
/// <summary>
/// 计划在某一未来的时间执行一个操作一次,如果这个时间比现在的时间小,就变成了立即执行的方式
/// </summary>
public class ScheduleExecutionOnce : ISchedule
{ /// <summary>
/// 构造函数
/// </summary>
/// <param name="schedule">计划开始执行的时间</param>
public ScheduleExecutionOnce(DateTime schedule)
{
m_schedule = schedule;
} private DateTime m_schedule; #region ISchedule 成员 public DateTime ExecutionTime
{
get
{
// TODO: 添加 ScheduleExecutionOnce.ExecutionTime getter 实现
return m_schedule;
}
set
{
m_schedule = value;
}
/// <summary>
/// 得到该计划还有多久才能运行
/// </summary>
public long DueTime
{
get
{
long ms = (m_schedule.Ticks - DateTime.Now.Ticks) / 10000; if (ms < 0) ms = 0;
return ms;
}
}
public long Period
{
get
{
// TODO: 添加 ScheduleExecutionOnce.Period getter 实现
return Timeout.Infinite;
}
}
#endregion
}
/// <summary>
/// 周期性的执行计划
/// </summary>
public class CycExecution : ISchedule
{
/// <summary>
/// 构造函数,在一个将来时间开始运行
/// </summary>
/// <param name="shedule">计划执行的时间</param>
/// <param name="period">周期时间</param>
public CycExecution(DateTime shedule, TimeSpan period)
{
m_schedule = shedule;
m_period = period;
}
/// <summary>
/// 构造函数,马上开始运行
/// </summary>
/// <param name="period">周期时间</param>
public CycExecution(TimeSpan period)
{
m_schedule = DateTime.Now;
m_period = period;
}
private DateTime m_schedule;
private TimeSpan m_period; #region ISchedule 成员
public long DueTime
{
get
{
long ms = (m_schedule.Ticks - DateTime.Now.Ticks) / 10000; if (ms < 0) ms = 0;
return ms;
}
} publc DateTime ExecutionTime
{
get
{
// TODO: 添加 CycExecution.ExecutionTime getter 实现
return m_schedule;
}
set
{
m_schedule = value;
}
} public long Period
{
get
{
// TODO: 添加 CycExecution.Period getter 实现
return m_period.Ticks / 10000;
}
} #endregion }
#endregion
using System.Collections;
using System.Threading;
namespace POSTiming
{
#region 任务计划接口和一些标准实现
/// <summary>
/// 计划的接口
/// </summary>
public interface ISchedule
{
/// <summary>
/// 返回最初计划执行时间
/// </summary>
DateTime ExecutionTime
{
get;
set;
}
/// <summary>
/// 初始化执行时间于现在时间的时间刻度差
/// </summary>
long DueTime
{
get;
}
/// <summary>
/// 循环的周期
/// </summary>
long Period
{
get;
} }
/// <summary>
/// 计划立即执行任务
/// </summary>
public class ImmediateExecution : ISchedule
{
#region ISchedule 成员
public DateTime ExecutionTime
{
get
{
// TODO: 添加 ImmediatelyShedule.ExecutionTime getter 实现
return DateTime.Now;
}
set
{
;
}
}
public long DueTime
{
get
{
return 0;
}
}
public long Period
{
get
{
// TODO: 添加 ImmediatelyShedule.Period getter 实现
return Timeout.Infinite;
}
}
#endregion
}
/// <summary>
/// 计划在某一未来的时间执行一个操作一次,如果这个时间比现在的时间小,就变成了立即执行的方式
/// </summary>
public class ScheduleExecutionOnce : ISchedule
{ /// <summary>
/// 构造函数
/// </summary>
/// <param name="schedule">计划开始执行的时间</param>
public ScheduleExecutionOnce(DateTime schedule)
{
m_schedule = schedule;
} private DateTime m_schedule; #region ISchedule 成员 public DateTime ExecutionTime
{
get
{
// TODO: 添加 ScheduleExecutionOnce.ExecutionTime getter 实现
return m_schedule;
}
set
{
m_schedule = value;
}
/// <summary>
/// 得到该计划还有多久才能运行
/// </summary>
public long DueTime
{
get
{
long ms = (m_schedule.Ticks - DateTime.Now.Ticks) / 10000; if (ms < 0) ms = 0;
return ms;
}
}
public long Period
{
get
{
// TODO: 添加 ScheduleExecutionOnce.Period getter 实现
return Timeout.Infinite;
}
}
#endregion
}
/// <summary>
/// 周期性的执行计划
/// </summary>
public class CycExecution : ISchedule
{
/// <summary>
/// 构造函数,在一个将来时间开始运行
/// </summary>
/// <param name="shedule">计划执行的时间</param>
/// <param name="period">周期时间</param>
public CycExecution(DateTime shedule, TimeSpan period)
{
m_schedule = shedule;
m_period = period;
}
/// <summary>
/// 构造函数,马上开始运行
/// </summary>
/// <param name="period">周期时间</param>
public CycExecution(TimeSpan period)
{
m_schedule = DateTime.Now;
m_period = period;
}
private DateTime m_schedule;
private TimeSpan m_period; #region ISchedule 成员
public long DueTime
{
get
{
long ms = (m_schedule.Ticks - DateTime.Now.Ticks) / 10000; if (ms < 0) ms = 0;
return ms;
}
} publc DateTime ExecutionTime
{
get
{
// TODO: 添加 CycExecution.ExecutionTime getter 实现
return m_schedule;
}
set
{
m_schedule = value;
}
} public long Period
{
get
{
// TODO: 添加 CycExecution.Period getter 实现
return m_period.Ticks / 10000;
}
} #endregion }
#endregion
/// <summary>
/// 计划任务基类
/// 启动的任务会在工作工作线程中完成,调用启动方法后会立即返回。
///
/// 用法:
/// (1)如果你要创建自己的任务,需要从这个类继承一个新类,然后重载Execute(object param)方法.
/// 实现自己的任务,再把任务加入到任务管理中心来启动和停止。
/// 比如:
/// TaskCenter center = new TaskCenter();
/// Task newTask = new Task( new ImmediateExecution());
/// center.AddTask(newTask);
/// center.StartAllTask(); /// (2)直接把自己的任务写入TimerCallBack委托,然后生成一个Task类的实例,
/// 设置它的Job和JobParam属性,再Start就可以启动该服务了。此时不能够再使用任务管理中心了。
/// 比如:
/// Task newTask = new Task( new ImmediateExecution());
/// newTask.Job+= new TimerCallback(newTask.Execute);
/// newTask.JobParam = "Test immedialte task"; //添加自己的参数
/// newTask.Start();
///
/// </summary>
public class Task
{
/// <summary>
/// 构造函数
/// </summary>
/// <param name="schedule">为每个任务制定一个执行计划</param>
public Task(ISchedule schedule)
{
if (schedule == null)
{
throw (new ArgumentNullException("schedule"));
} m_schedule = schedule;
}
/// <summary>
/// 启动任务
/// </summary>
public void Start()
{
//启动定时器
m_timer = new Timer(m_execTask, m_param, m_schedule.DueTime, m_schedule.Period);
}
/// <summary>
/// 停止任务
/// </summary>
public void Stop()
{
//停止定时器
m_timer.Change(Timeout.Infinite, Timeout.Infinite); }
/// <summary>
/// 任务内容
/// </summary>
/// <param name="param">任务函数参数</param>
public virtual void Execute(object param)
{
//你需要重载该函数,但是需要在你的新函数中调用base.Execute();
m_lastExecuteTime = DateTime.Now; if (m_schedule.Period == Timeout.Infinite)
{
m_nextExecuteTime = DateTime.MaxValue; //下次运行的时间不存在
}
else
{
TimeSpan period = new TimeSpan(m_schedule.Period * 1000); m_nextExecuteTime = m_lastExecuteTime + period;
} }
/// <summary>
/// 任务下执行时间
/// </summary>
public DateTime NextExecuteTime
{
get
{
return m_nextExecuteTime;
}
}
DateTime m_nextExecuteTime;
/// <summary>
/// 执行任务的计划
/// </summary>
public ISchedule Shedule
{
get
{
return m_schedule;
}
}
private ISchedule m_schedule; /// <summary>
/// 系统定时器
/// </summary>
private Timer m_timer; /// <summary>
/// 任务内容
/// </summary>
public TimerCallback Job
{
get
{
return m_execTask;
}
set
{
m_execTask = value;
}
} private TimerCallback m_execTask; /// <summary>
/// 任务参数
/// </summary>
public object JobParam
{
set
{
m_param = value;
}
}
private object m_param; /// <summary>
/// 任务名称
/// </summary>
public string Name
{
get
{
return m_name;
}
set
{
m_name = value;
}
}
private string m_name; /// <summary>
/// 任务描述
/// </summary>
public string Description
{
get
{
return m_description;
}
set
{
m_description = value;
}
}
private string m_description; /// <summary>
/// 该任务最后一次执行的时间
/// </summary>
public DateTime LastExecuteTime
{
get
{
return m_lastExecuteTime;
}
}
private DateTime m_lastExecuteTime; } #endregion #region 启动任务 /// <summary>
/// 任务管理中心
/// 使用它可以管理一个或则多个同时运行的任务
/// </summary>
public class TaskCenter
{
/// <summary>
/// 构造函数
/// </summary>
public TaskCenter()
{
m_scheduleTasks = new ArrayList();
}
/// <summary>
/// 添加任务
/// </summary>
/// <param name="newTask">新任务</param>
public void AddTask(Task newTask)
{
m_scheduleTasks.Add(newTask);
}
/// <summary>
/// 删除任务
/// </summary>
/// <param name="delTask">将要删除的任务,你可能需要停止掉该任务</param>
public void DelTask(Task delTask)
{
m_scheduleTasks.Remove(delTask);
}
/// <summary>
/// 启动所有的任务
/// </summary>
public void StartAllTask()
{
foreach (Task task in ScheduleTasks)
{
StartTask(task);
}
}
/// <summary>
/// 启动一个任务
/// </summary>
/// <param name="task"></param>
public void StartTask(Task task)
{
//标准启动方法
if (task.Job == null)
{
task.Job += new TimerCallback(task.Execute);
} task.Start();
}
/// 终止所有的任务
/// </summary>
public void TerminateAllTask()
{
foreach (Task task in ScheduleTasks)
{
TerminateTask(task);
}
}
/// <summary>
/// 终止一个任务
/// </summary>
/// <param name="task"></param>
public void TerminateTask(Task task)
{
task.Stop();
}
/// <summary>
/// 获得所有的任务
/// </summary>
ArrayList ScheduleTasks
{
get
{
return m_scheduleTasks;
}
}
private ArrayList m_scheduleTasks;
/// <summary>
/// 单元测试代码
/// </summary>
public void TestTaskCenter()
{
TaskCenter center = new TaskCenter(); //Test immedialte task
Task newTask = new Task(new ImmediateExecution());
newTask.Job += new TimerCallback(newTask.Execute);
newTask.JobParam = "Test immedialte task"; //Test excute once task
DateTime sheduleTime = DateTime.Now.AddSeconds(10); ScheduleExecutionOnce future = new ScheduleExecutionOnce(sheduleTime); Task sheduleTask = new Task(future);
sheduleTask.Job += new TimerCallback(sheduleTask.Execute);
sheduleTask.JobParam = "Test excute once task"; //Test cyc task at once CycExecution cyc = new CycExecution(new TimeSpan(0, 0, 2));
Task cysTask = new Task(cyc); cysTask.Job += new TimerCallback(cysTask.Execute);
cysTask.JobParam = "Test cyc task"; //Test cys task at schedule CycExecution cycShedule = new CycExecution(DateTime.Now.AddSeconds(8), new TimeSpan(0, 0, 2)); Task cycSheduleTask = new Task(cycShedule); cycSheduleTask.Job += new TimerCallback(cysTask.Execute);
cycSheduleTask.JobParam = "Test cyc Shedule task";
center.AddTask(newTask);
center.AddTask(sheduleTask);
center.AddTask(cysTask); center.AddTask(cycSheduleTask); center.StartAllTask(); Console.ReadLine(); Console.WriteLine(newTask.LastExecuteTime);
}
} #endregion
}
namespace POSTiming
{
//测试代码
using System;
using System.Threading;
/// <summary>
/// 解释怎么创建自己的任务类,和使用它们
/// </summary>
class TestTask : Task
{
public TestTask(ISchedule schedule)
: base(schedule)
{ } public override void Execute(object param)
{
//一定要保留
base.Execute(param); Console.WriteLine("Begin to execute a long job...NextExecuteTime:{0}", this.NextExecuteTime); Thread.Sleep(5000); Console.WriteLine("Test Tast execute job.Last ExecuteTime {0}, ",
this.LastExecuteTime
);
} [STAThread]
static void Main(string[] args)
{
TaskCenter center = new TaskCenter(); //Test immediate task
Task newTask = new TestTask(new ImmediateExecution());
newTask.JobParam = "Test immedialte task"; //Test excute once task
DateTime sheduleTime = DateTime.Now.AddSeconds(10);
ScheduleExecutionOnce future = new ScheduleExecutionOnce(sheduleTime);
Task sheduleTask = new TestTask(future);
sheduleTask.JobParam = "Test excute once task"; //Test cyc task at once
CycExecution cyc = new CycExecution(new TimeSpan(0, 0, 2));
Task cysTask = new TestTask(cyc);
cysTask.JobParam = "Test cyc task"; //Test cys task at schedule
CycExecution cycShedule = new CycExecution(DateTime.Now.AddSeconds(8), new TimeSpan(0, 0, 2));
Task cycSheduleTask = new TestTask(cycShedule);
cycSheduleTask.JobParam = "Test cyc Shedule task";
center.AddTask(newTask);
center.AddTask(sheduleTask);
center.AddTask(cysTask);
center.AddTask(cycSheduleTask);
center.StartAllTask();
Console.ReadLine();
Console.WriteLine("terminate all task");
center.TerminateAllTask();
Console.ReadLine();
}
}
}
问题:当添加多个计划任务的时候,一旦有符合的时间就开始执行托管程序,这时在TestTask类的重写方法中Execute() 如何得知正在运行的计划任务时多个中的哪一个??? 万分感谢!