自己一直想做个定时任务工具,以前一直时间做,最近,在寝室,每天都为电脑连网烦恼,自己就花了时间做了一个定时自动运行程序的小工具,C#winform程序先看一下它的界面:
这里面知识点还比较多,下面动手一步一步做,也不难的。
新建一个窗体应用程序项目,我的项目名就是:
新建一个接口,ISchedule.cs内容如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace 定时任务工具
{
writeline教程    //任务计划接口和一些标准实现
    #region 任务计划接口和一些标准实现
    //// <summary>
    /// 计划的接口
    /// </summary>
    public interface ISchedule
    {
        /// <summary>
        /// 返回最初计划执行时间
        /// </summary>
        DateTime ExecutionTime
        {
            get;
            set;
        }
        /// <summary>
        /// 初始化执行时间于现在时间的时间刻度差
        /// </summary>
        long DueTime
        {
            get;
        }
        /// <summary>
        /// 循环的周期
        /// </summary>
        long Period
        {
            get;
        }
    }
    #endregion
}
再新建一个类,CycExecution.cs 定义执行定时任务计划的相关参数,内容如下:
using System;
using System.Collections.Generic;
using System.Text;
namespace 定时任务工具
{
    /// <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;
        //ISchedule 成员
        #region ISchedule 成员
        public long DueTime
        {
            get
            {
                long ms = (m_schedule.Ticks - DateTime.Now.Ticks) / 10000;
                if (ms < 0) ms = 0;
                return ms;
            }
        }
        public 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
    }
}
再新建一个具体实现定时器任务的类,Task.cs 内容如下:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace 定时任务工具
{
    //// <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);

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。