夜鹰教程网-程序员的加油站
 当前位置:文章中心 >> Winform/客户端程序
C# Task 任务计划
夜鹰教程网 来源:www.yyjcw.com 日期:2017-11-17 10:30:02
C# Task 任务计划

代码

using System;
using System.Threading;
using System.Collections.Generic;

namespace Rocky
{
    #region Task
    public class Task : IDisposable
    {
        #region Fields
        private string taskName;
        private Timer timer;
        private TimerCallback execTask;
        private ISchedule schedule;
        private DateTime lastExecuteTime;
        private DateTime nextExecuteTime;
        #endregion

        #region Properties
        /// <summary>
        /// 任务名称
        /// </summary>
        public string Name
        {
            set { taskName = value; }
            get { return taskName; }
        }
        /// <summary>
        /// 执行任务的计划
        /// </summary>
        public ISchedule Shedule
        {
            get { return schedule; }
        }
        /// <summary>
        /// 该任务最后一次执行的时间
        /// </summary>
        public DateTime LastExecuteTime
        {
            get { return lastExecuteTime; }
        }
        /// <summary>
        /// 任务下执行时间
        /// </summary>
        public DateTime NextExecuteTime
        {
            get { return nextExecuteTime; }
        }
        #endregion

        #region Methods
        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="schedule">为每个任务制定一个执行计划</param>
        public Task(TimerCallback callback, ISchedule schedule)
        {
            if (callback == null || schedule == null)
            {
                throw new ArgumentNullException();
            }
            this.execTask = callback;
            this.schedule = schedule;
            execTask += new TimerCallback(Execute);
            TaskScheduler.Register(this);
        }

        /// <summary>
        /// 任务内容
        /// </summary>
        /// <param name="state">任务函数参数</param>
        private void Execute(object state)
        {
            lastExecuteTime = DateTime.Now;
            if (schedule.Period == Timeout.Infinite)
            {
                nextExecuteTime = DateTime.MaxValue; //下次运行的时间不存在
            }
            else
            {
                TimeSpan period = new TimeSpan(schedule.Period * 1000);
                nextExecuteTime = lastExecuteTime + period;
            }
            if (!(schedule is CycExecution))
            {
                this.Close();
            }
        }

        public void Start()
        {
            Start(null);
        }
        public void Start(object execTaskState)
        {
            if (timer == null)
            {
                timer = new Timer(execTask, execTaskState, schedule.DueTime, schedule.Period);
            }
            <;span style="color: #0000ff;">else
            {
                timer.Change(schedule.DueTime, schedule.Period);
            }
        }
        public void RefreshSchedule()
        {
            if (timer != null)
            {
                timer.Change(schedule.DueTime, schedule.Period);
            }
        }
        public void Stop()
        {
            if (timer != null)
            {
                timer.Change(Timeout.Infinite, Timeout.Infinite);
            }
        }

        public void Close()
        {
            ((IDisposable)this).Dispose();
        }

        void IDisposable.Dispose()
        {
            if (execTask != null)
            {
                taskName = null;
                if (timer != null)
                {
                    timer.Dispose();
                    timer = null;
                }
                execTask = null;
                TaskScheduler.Deregister(this);
            }
        }

        public override string ToString()
        {
            return taskName;
        }
        #endregion
    }
    #endregion

    #region TaskScheduler
    /// <summary>
    /// 任务管理中心
    /// 使用它可以管理一个或则多个同时运行的任务
    /// </summary>
    public static class TaskScheduler
    {
        private static List<Task> taskScheduler;

        public static int Count
        {
            get { return taskScheduler.Count; }
        }

        static TaskScheduler()
        {
            taskScheduler = new List<Task>();
        }

        /// <summary>
        /// 查找任务
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public static Task Find(string name)
        {
            return taskScheduler.Find(task => task.Name == name);
        }

        public static IEnumerator<Task> GetEnumerator()
        {
            return taskScheduler.GetEnumerator();
        }

        /// <summary>
        /// 终止任务
        /// </summary>
        public static void TerminateAllTask()
        {
            lock (taskScheduler)
            {
                taskScheduler.ForEach(task => task.Close());
                taskScheduler.Clear();
                taskScheduler.TrimExcess();
            }
        }

        internal static void Register(Task task)
        {
            lock (taskScheduler)
            {
                taskScheduler.Add(task);
            }
        }
        internal static void Deregister(Task task)
        {
            lock (taskScheduler)
            {
                taskScheduler.Remove(task);
            }
        }
    }
    #endregion

    #region ISchedule
    /// <summary>
    /// 计划立即执行任务
    /// </summary>
    public struct ImmediateExecution : ISchedule
    {
        public DateTime ExecutionTime
        {
            get { return DateTime.Now; }
            set { }
        }
        public long DueTime
        {
            get { return 0; }
        }
        public long Period
        {
            get { return Timeout.Infinite; }
        }
    }

    /// <summary>
    /// 计划在某一未来的时间执行一个操作一次,如果这个时间比现在的时间小,就变成了立即执行的方式
    /// </summary>
    public struct ScheduleExecutionOnce : ISchedule
    {
        private DateTime schedule;

        public DateTime ExecutionTime
        {
            get { return schedule; }
            set { schedule = value; }
        }
        /// <summary>
        /// 得到该计划还有多久才能运行
        /// </summary>
        public long DueTime
        {
            get
            {
                long ms = (schedule.Ticks - DateTime.Now.Ticks) / 10000;
                if (ms < 0)
                {
                    ms = 0;
                }
                return ms;
            }
        }
        public long Period
        {
            get { return Timeout.Infinite; }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="schedule">计划开始执行的时间</param>
        public ScheduleExecutionOnce(DateTime time)
        {
            schedule = time;
        }
    }

    /// <summary>
    /// 周期性的执行计划
    /// </summary>
    public struct CycExecution : ISchedule
    {
        private DateTime schedule;
        private TimeSpan period;

        public DateTime ExecutionTime
        {
            get { return schedule; }
            set { schedule = value; }
        }
        public long DueTime
        {
            get
            {
                long ms = (schedule.Ticks - DateTime.Now.Ticks) / 10000;
                if (ms < 0)
                {
                    ms = 0;
                }
                return ms;
            }
        }
        public long Period
        {
            get { return period.Ticks / 10000; }
        }

        /// <summary>
        /// 构造函数,马上开始运行
        /// </summary>
        /// <param name="period">周期时间</param>
        public CycExecution(TimeSpan period)
        {
            this.schedule = DateTime.Now;
            this.period = period;
        }
        /// <summary>
        /// 构造函数,在一个将来时间开始运行
        /// </summary>
        /// <param name="shedule">计划执行的时间</param>
        /// <param name="period">周期时间</param>
        public CycExecution(DateTime shedule, TimeSpan period)
        {
            this.schedule = shedule;
            this.period = period;
        }
    }

    /// <summary>
    /// 计划的接口
    /// </summary>
    public interface ISchedule
    {
        /// <summary>
        /// 返回最初计划执行时间
        /// </summary>
        DateTime ExecutionTime { set; get; }
        /// <summary>
        /// 初始化执行时间于现在时间的时间刻度差
        /// </summary>
        long DueTime { get; }
        /// <summary>
        /// 循环的周期
        /// </summary>
        long Period { get; }
    }
    #endregion
}

复制链接 网友评论 收藏本文 关闭此页
上一条: c#的委托(代理)和事件   下一条: C# socket 多线程多管道可断点传送大文…
夜鹰教程网成立于2008年,目前已经运营了将近 13 年,发布了大量关于 html5/css3/C#/asp.net/java/python/nodejs/mongodb/sql server/android/javascript/mysql/mvc/easyui/vue/echarts原创教程。 我们一直都在坚持的是:认证负责、一丝不苟、以工匠的精神来打磨每一套教程,让读者感受到作者的用心。我们默默投入的时间,确保每一套教程都是一件作品,而不是呆板的文字和视频! 目前我们推出在线辅导班试运营,模式为一对一辅导,教学工具为QQ。我们的辅导学科包括 java 、android原生开发、webapp开发、商城开发、C#和asp.net开发,winform和物联网开发、web前端开发,但不仅限于此。 普通班针对的是国内学员,例如想打好基础的大学生、想转行的有志青年、想深入学习的程序员、想开发软件的初学者或者业余爱好者等。 就业办针对即将毕业上岗的大四学生,或者打算转行的初级开发工程师。 留学生班针对的是在欧美、加拿大、澳洲、日本、韩国、新加坡等地留学的中国学子,目的是让大家熟练地掌握编程技能,按时完成老师布置的作业,并能顺利地通过考试。 详细咨询QQ:1416759661   夜鹰教程网  基于角色的权限管理系统(c-s/b-s)。
  夜鹰教程网  基于nodejs的聊天室开发视频教程
  夜鹰教程网  Git分布式版本管理视频教程
  夜鹰教程网  MVC+EasyUI视频教程
  夜鹰教程网  在线考试系统视频教程
  夜鹰教程网  MongoDB视频教程。
  夜鹰教程网 Canvas视频教程
  夜鹰教程网 报表开发视频教程
  热点推荐
破解封路由的方法详解
技巧篇:只用这一招就能拒绝全部的…
挂马方法和技巧大汇总
网络安全防护:如何防止远程入侵
如何解决:系统开机就弹出广告网页…
彻底防御U盘病毒
安全配置交换机端口提高网络安全性…
浅析网络安全审计原理和技术(2)
用U盘就可以去除win XP管理员密码…
电脑硬盘各逻辑盘用鼠标左键双击它…
详解网站挂马的手段
新手认识;网银账号相关知识
ARP欺骗和ICMP欺骗催生全新DOS工具…
浅析网络安全审计原理和技术(1)
木马最基本的隐藏:不可见窗体和隐…
  最近更新
.NET C# 和Java开发人员岗位切换
模拟登录人人网
HttpWebRequest以及HttpWebRespon…
HttpClient使用说明
Winform为Combobox树添加数据
C#之允许DataGridView选中整行
C#中DataGridView只能选择一行禁止…
为自动填充列调整大小期间不能执行…
c# winform设置listBox如何设置te…
c#的委托(代理)和事件
C# Task 任务计划
C# socket 多线程多管道可断点传送…
让ListBox的滚动条滚动到最底部
c#用事件模式实现通知
什么是异步编程,为什么会需要异…

关于我们 | 网站建设 | 技术辅导 | 常见问题 | 联系我们 | 友情链接

夜鹰教程网 版权所有 www.yyjcw.com All rights reserved 备案号:蜀ICP备08011740号3