C#&.Net干货分享-构建后台自动定时任务的源码
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干货分享-构建后台自动定时任务的源码的更多相关文章
- 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码]
原文:构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(2)-easyui构建前端页面框架[附源码] 开始,我们有了一系列的解决方案,我们将动手搭建新系统吧. 用 ...
- NhibernateProfiler-写个自动破解工具(源码)
04 2013 档案 [屌丝的逆袭系列]是个人都能破解之终结NhibernateProfiler-写个自动破解工具(源码) 摘要: 破解思路分析及手动破解 增加“附加到进程”功能--功能介绍增加“ ...
- Delphi制作QQ自动登录器源码
Delphi制作QQ自动登录器源码 http://www.cnblogs.com/sunsoft/archive/2011/02/25/1964967.html 以TM2009为例,检查了一下,未登 ...
- C#&.Net干货分享- 构建Spire-Office相关Helper操作Word、Excel、PDF等
先下载好如下的组件: 直接使用完整源码分享: namespace Frame.Office{ /// <summary> /// Spire_WordHelper /// ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(2)-easyui构建前端页面框架[附源码]
系列目录 前言 为了符合后面更新后的重构系统,本文于2016-10-31日修正一些截图,文字 我们有了一系列的解决方案,我们将动手搭建新系统吧. 后台系统没有多大的UI视觉,这次我们采用的是标准的左右 ...
- 分享非常漂亮的WPF界面框架源码及插件化实现原理
在上文<分享一个非常漂亮的WPF界面框架>中我简单的介绍了一个界面框架,有朋友已经指出了,这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于Mod ...
- extjs+MVC4+PetaPoco+AutoFac+AutoMapper后台管理系统(附源码)
前言 本项目使用的开发环境及技术列举如下:1.开发环境IDE:VS2010+MVC4数据库:SQLServer20082.技术前端:Extjs后端:(1).数据持久层:轻量级ORM框架PetaPoco ...
- android完整智能家居、备忘录、蓝牙配对、3D动画库、购物车页面、版本更新自动安装等源码
Android精选源码 app 版本更新.下载完毕自动自动安装 android指针式分数仪表盘 ANdroid蓝牙设备搜索.配对 Android 图片水印框架,支持隐形数字水印 android3D旋转 ...
- 使用Jenkins+Pipline 持构建自动化部署之安卓源码打包、测试、邮件通知
一.引言 Jenkins 2.x的精髓是Pipeline as Code,那为什么要用Pipeline呢?jenkins1.0也能实现自动化构建,但Pipeline能够将以前project中的配置信息 ...
随机推荐
- Jupyter修改设置
下载完anaconda后Jupyter默认目录是用户目录,默认浏览器是IE,让有强迫症的我有点难受,所以把它的默认目录和浏览器修改一下. 首先运行一下jupyter notebook --genera ...
- React 面试问题
eact 面试问题 如果你是一位有理想的前端开发人员,并且正在准备面试,那么这篇文章就是为你准备的.本文收集了 React 面试中最常见的 50 大问题,这是一份理想的指南,让你为 React 相关的 ...
- JavaScript 函数工具
组 all:布尔全等判断 const all = (arr, fn = Boolean) => arr.every(fn); all([4, 2, 3], x => x > 1); ...
- 第二个视频作品《[SpringCloudAlibaba]微服务之注册中心nacos》上线了
1.场景描述 第二个视频作品出炉了,<[SpringCloudAlibaba]微服务之注册中心nacos>上线了,有需要的朋友可以直接点击链接观看.(如需购买,请通过本文链接购买) 2. ...
- C语言笔记 05_判断&循环&函数
判断 C 语言把任何非零和非空的值假定为 true,把零或 null 假定为 false. 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C 语言提供了以下类型的判断语句.点击链接查看每 ...
- 利用Python写一个抽奖程序,解密游戏内抽奖的秘密
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
- JVM进入老年代情况
1.躲过15次GC之后进入老年代 默认的设置下,当对象的年龄达到15岁的时候,也就是躲过15次Gc的时候,他就会转移到老年代中去 这个具体是多少岁进入老年代,可以通过JVM参数 “-XX:MaxTen ...
- Mybatis的小技巧
一.使用resultMap字段关联对象属性太麻烦 eg:过于复杂,类似这种结果集转换的,只需要在配置文件中开启自动转换进行了,无需再手动写了很麻烦 替换办法:开启骆驼命名法进行匹配就ok了,实体类字段 ...
- 用PYTHON首选的GUI库WXPYTHON做程序界面
大家好,我是A8U神经网络,今天又要跟大家分享一下wxWidgets开发神经网络程序界面的一些经验,希望对开发有兴趣的朋友有所帮助.跨平台的GUI工具库以GTK +,Qt和wxWidgets闻名. G ...
- C# 序列化和反序列化(xml 文件)
序列化是将对象保存为文本文件或二进制文件: 反序列化则是读取文件信息,还原为对象: 序列化保存为文本内容,主要是 xml 和 json 两种,这里介绍序列化为 xml 文件的方式. 想要序列化,先要在 ...