1、创建一个自动处理中心任务参数的类,直接源码:

namespace Frame.AutoProcess
{
    /// <summary>
    /// 委托(用于异步处理任务)
    /// </summary>
    /// <param name="parameter">任务参数</param>
    /// <returns>是否执行成功</returns>
    public delegate bool TaskHandle(object parameter);

/// <summary>
    /// 自动处理中心任务参数
    /// </summary>
    public class BackgroundTask
    {
        #region 私有成员
        private bool _IsOnce = true; //是否执行一次
        private bool _IsExecuteNow = false; //是否立即执行,对于重复执行生效
        private int _Interval = 86400; //重复执行时的执行间隔,秒为单位,默认为一天,如果只执行一次并且想马上执行将该值设置为0
        private bool _IsAbortExcute = false; //终止执行(设置为true时,系统将不会执行Timer的事件)
        private TaskHandle _ExecuteMethod = null; //任务执行方法
        private object _Parameter = null; //任务执行方法参数
        private DateTime? _ExecuteDateTime = null;
        #endregion

#region 属性

/// <summary>
        /// 是否已经终止
        /// </summary>
        public bool IsAbortExcute
        {
            get { return this._IsAbortExcute; }
        }

/// <summary>
        /// 执行的方法
        /// </summary>
        public TaskHandle ExecuteMethod
        {
            get { return this._ExecuteMethod; }
        }

#endregion

#region 构造函数

/// <summary>
        /// 任务参数构造函数
        /// </summary>
        /// <param name="executeMethod">执行方法</param>
        /// <param name="parameter">方法参数</param>
        /// <param name="isOnce">是否执行一次</param>
        /// <param name="interval">执行间隔(秒),默认为24小时</param>
        /// <param name="isExecuteNow">是否立即执行</param>
        /// <param name="executeDateTime"></param>
        public BackgroundTask(TaskHandle executeMethod, object parameter = null, bool isOnce = true, int interval = 86400, bool isExecuteNow = false, DateTime? executeDateTime = null)
        {
            this._ExecuteMethod = executeMethod;
            this._Parameter = parameter;
            this._IsOnce = isOnce;
            this._Interval = interval;
            if (interval < 0)
            {
                this._Interval = 1;
            }
            this._IsExecuteNow = isExecuteNow;
            this._ExecuteDateTime = executeDateTime;
        }

#endregion

/// <summary>
        /// 开始执行任务
        /// </summary>
        /// <returns></returns>
        public void Execute()
        {
            if (!AutoProcessTask.IsStart) return;
            int interval = _Interval * 1000;
            if (interval == 0) interval = 1;
            /*
             Timer是提供以指定的时间间隔执行某方法的这样一种机制,
             * 即如果想要实现一个定时发送数据,比如每隔3s中发送一次心跳报文,或者执行某个指定的方法,
             * 都可以考虑用Timer类来实现,
             * 不过要提出的是Timer类一边用来做一些比较简单又不耗时间的操作。
             * 据说是因为它执行的任务仍然在主线程里面
             */
            if (this._ExecuteDateTime.HasValue) //按执行时间时每秒跑一次
                interval = 1000;
            Timer _timer = new Timer(interval);
            _timer.AutoReset = !_IsOnce;
            _timer.Enabled = true;
            if (_IsExecuteNow && !_IsOnce) //立即执行
            {
                _ExecuteMethod.BeginInvoke(_Parameter, null, null);
            }
            _timer.Elapsed += new ElapsedEventHandler(Start);
            if (_IsOnce && _timer != null)
            {
                _timer.Enabled = false;
                _timer.Elapsed -= new ElapsedEventHandler(Start);
                _timer = null;
            }
        }

/// <summary>
        /// 开始执行Timer具体方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Start(object sender, ElapsedEventArgs e)
        {
            if (this._ExecuteDateTime.HasValue)
            {
                DateTime now = DateTime.Now;
                DateTime executeTime = this._ExecuteDateTime.Value;
                if (executeTime.Hour == now.Hour && executeTime.Minute == now.Minute && executeTime.Second == now.Second)
                {
                    _ExecuteMethod.BeginInvoke(_Parameter, null, null);
                }
                else
                {
                    (sender as Timer).Interval = 1000;
                }
            }
            else
            {
                _ExecuteMethod.BeginInvoke(_Parameter, null, null);
            }
        }
    }
}

2、定义自动处理任务的任务操作类,直接源码:

namespace Frame.AutoProcess
{
    /// <summary>
    /// 自动处理任务
    /// </summary>
    public class AutoProcessTask
    {
        /// <summary>
        /// 执行Execute方法后事件
        /// </summary>
        public static event EventHandler EventAfterExecute;

/// <summary>
        /// 是否已经开始运行
        /// </summary>
        private static bool isStart = false;

/// <summary>
        /// 任务列表
        /// </summary>
        private static List<BackgroundTask> taskList = new List<BackgroundTask>();

/// <summary>
        /// 是否启动
        /// </summary>
        public static bool IsStart
        {
            get { return isStart; }
        }
       
        /// <summary>
        /// 添加任务
        /// </summary>
        /// <param name="task">任务对象</param>
        public static void AddTask(BackgroundTask task)
        {
            if (task != null && isStart)
            {
                BackgroundTask tempTask = taskList.Where(O => O.ExecuteMethod == task.ExecuteMethod).FirstOrDefault();
                if (tempTask != null) //系统已存在该任务
                {
                    return;
                }
                taskList.Add(task); //添加到任务列表
                task.Execute(); //开始执行任务
            }
        }

/// <summary>
        /// 执行任务
        /// </summary>
        public static void Execute()
        {
            isStart = true;
            if (EventAfterExecute != null)
            {
                EventAfterExecute(null, null);
            }
        }
    }
}

3、调用方式,一般都是在工程启动的时候添加如下直接源码:

BackgroundTask extractAttachmentTextTask = new BackgroundTask((args) =>
            {
                string errMsg = string.Empty;
                try
                {
                   你的逻辑。。。。。。。。。。
                }
                catch
                { }
                return true;
            }, null, false, 3600, false);//每小时执行一次

C#&.Net干货分享-构建后台自动定时任务的源码的更多相关文章

  1. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码]

    原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码] 开始,我们有了一系列的解决方案,我们将动手搭建新系统吧. 用 ...

  2. NhibernateProfiler-写个自动破解工具(源码)

    04 2013 档案   [屌丝的逆袭系列]是个人都能破解之终结NhibernateProfiler-写个自动破解工具(源码) 摘要: 破解思路分析及手动破解 增加“附加到进程”功能--功能介绍增加“ ...

  3. Delphi制作QQ自动登录器源码

    Delphi制作QQ自动登录器源码  http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html 以TM2009为例,检查了一下,未登 ...

  4. C#&.Net干货分享- 构建Spire-Office相关Helper操作Word、Excel、PDF等

    先下载好如下的组件: 直接使用完整源码分享: namespace Frame.Office{    /// <summary>    /// Spire_WordHelper    /// ...

  5. ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]

    系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...

  6. 分享非常漂亮的WPF界面框架源码及插件化实现原理

      在上文<分享一个非常漂亮的WPF界面框架>中我简单的介绍了一个界面框架,有朋友已经指出了,这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于Mod ...

  7. extjs+MVC4+PetaPoco+AutoFac+AutoMapper后台管理系统(附源码)

    前言 本项目使用的开发环境及技术列举如下:1.开发环境IDE:VS2010+MVC4数据库:SQLServer20082.技术前端:Extjs后端:(1).数据持久层:轻量级ORM框架PetaPoco ...

  8. android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码

    Android精选源码 app 版本更新.下载完毕自动自动安装 android指针式分数仪表盘 ANdroid蓝牙设备搜索.配对 Android 图片水印框架,支持隐形数字水印 android3D旋转 ...

  9. 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知

    一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...

随机推荐

  1. MYSQL 游标学习及使用实例

    who?(游标是什么?)游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果.每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言 ...

  2. linux学习第一周

    1. 按系列罗列Linux的发行版,并描述不同发行版之间的联系与区别 2. 安装Centos7.6操作系统,创建一个自己名字的用户名,并可以正常登录,将主要步骤截图. 3. 配置环境变量,实现执行hi ...

  3. mysql如何处理高并发(转)

    mysql高并发的解决方法有:优化SQL语句,优化数据库字段,加缓存,分区表,读写分离以及垂直拆分,解耦模块,水平切分等. 高并发大多的瓶颈在后台,在存储mysql的正常的优化方案如下: (1)代码中 ...

  4. jvm虚拟机笔记<三> 类文件结构与类加载机制

    java虚拟机具有语言无关系,它只和“class文件“这种特定的二进制文件格式绑定. 不同语言的编译器将对应的程序编译成字节码文件(*.class),送给jvm执行. class文件本质上就是一张表, ...

  5. 松软科技web课堂:JavaScript 布尔(逻辑)

    JavaScript 布尔(逻辑)代表两个值之一:true 或 false. 布尔值 通常,在编程中,您会需要只能有两个值之一的数据类型,比如 YES / NO ON / OFF TRUE / FAL ...

  6. JDK新特性关于流操作部分

    // array 工具类 可以用来快捷的将数组转化为list List<String> strings = Arrays.asList("zhongguo", &quo ...

  7. Where is the kernel documentation?; Ubuntu 上如何安装 linux 内核文档;fedora 上如何安装linux内核文档?

    有时候,linux内核文档对我们很重要,我们可以在linux系统中安装,并及时查看: 参考链接:https://askubuntu.com/questions/841043/where-is-the- ...

  8. Vue+Vuex初体验

    首先: 安装vuex npm install vuex -S 需要有两个组件(HelloWord.vue 和 HelloDemo.vue)[组件自定义] 注册路由 注册store 测试 一.需要有两个 ...

  9. 【西北师大-2108Java】第十次作业成绩汇总

    [西北师大-2108Java]第十次作业成绩汇总 作业题目 面向对象程序设计(JAVA) 第12周学习指导及要求 实验目的与要求 (1)掌握Vetor.Stack.Hashtable三个类的用途及常用 ...

  10. Tkinter使frame填充整个区域

    在未设置默认情况下效果为 设置之后出现效果 使用方法: 增加 fill=X/Y/BOTH 以我为例: leftFrame.pack(side='left',fill=Y)