C#封装定时执行任务类
a.日常开发中经常会遇到定时去执行一些操作,比如定时更新数据。A类需要做我们写个Timer定时去取数据,这时候B类,C类也需要做这样的事情,是不是需要写三次重复代码?
这时候把timer封装成一个帮助的类来解决这个问题。
b.封装的思路:
1.这个类具有定时处理的功能
2.既然定时处理,处理什么事情呢?需要开放一个委托,让使用者告诉这个类需要做什么事情。
3.那多久做一次这件事情呢?需要开放一个参数,时间间隔。
4.封装的意义就是多处使用,且调用者不用关心内部实现。简单来说就是让使用者调用起来方便。
c.既然这个帮助类是为整个解决方案服务的,这时候起名字就定为。TimerService。
下面上个效果图,直观的了解定时任务。

public class TimerService
{
#region Private Members
private static TimerService _instance = new TimerService();
#endregion #region Constructors
private TimerService()
{
}
#endregion #region Public Properties
public static TimerService Instance
{
get { return _instance; }
}
#endregion #region Public Methods
public void Schedule(Action action, int interval)
{
TimerTask task = default(TimerTask);
task = new TimerTask(action, interval);
}
#endregion #region Private Methods
#endregion
}
TimerService
class TimerTask
{
#region Private Members
public string _desc;
public System.Timers.Timer _timer;
private WeakReference<object> _target;
private MethodInfo _method;
private GCHandle _gcHandle;
#endregion #region Constructors
public TimerTask(Action ac, int interval)
{
_gcHandle = GCHandle.Alloc(this);
_method = ac.Method;
_target = new WeakReference<object>(ac.Target);
_desc = ac.Method + "@" + ac.Target;
_timer = new System.Timers.Timer(interval * );
_timer.Elapsed += Timer_Elapsed;
_timer.Start();
}
#endregion #region Public Properties
#endregion #region Public Methods
public void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
try
{
object t;
bool hasRef = _target.TryGetTarget(out t);
if (hasRef)
{
_method.Invoke(t, null);
}
else
{
_timer.Stop();
_gcHandle.Free();
Console.WriteLine("Auto free timer: " + _desc);
}
t = null;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.WriteLine(ex.StackTrace);
}
}
#endregion #region Private Methods
#endregion
}
TimerTask
如有任何错误欢迎指出。
C#封装定时执行任务类的更多相关文章
- 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫
前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ...
- 使用System.Timers.Timer类实现程序定时执行
使用System.Timers.Timer类实现程序定时执行 在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和Sys ...
- 定时执行任务-springboot
定时执行任务-springboot 先看两个接口 这两个接口springboot已经帮我们封装好了,我们不需要去手动使用 TaskScheduler //任务调度者 TaskExecutor //任务 ...
- linux定时执行任务crontab命令用法
linux系统的定时任务是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于使用者自己也可以设置计划任务,所 ...
- 基于ASP.NET MVC定时执行任务调度
相对FluentScheduler实现定时调度任务的使用简单,配置少的特点,Quartz.Net则配置稍微复杂一些.下面我们就接合一个 ASP.NET MVC网站应用程序的定时执行任务调试的小实例来了 ...
- Java 在某一个时间点定时执行任务(转载)
java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager { //时间间隔 private static final long PERIOD_ ...
- 【ASP.NET 进阶】定时执行任务实现 (定时读取和修改txt文件数字内容,无刷新显示结果)
现在有很多网站或系统需要在服务端定时做某件事情,如每天早上8点半清理数据库中的无效数据等等,Demo 具体实现步骤如下: 0.先看解决方案截图 1.创建ASP.NET项目TimedTask,然后新建一 ...
- 【ASP.NET 进阶】定时执行任务
原理:利用全局应用程序类 Global.asax 和 System.Timers.Timer 类定时处理任务. 示例效果图: 其 Global.asax 类代码如下: using System; u ...
- JAVA定时执行任务,每天定时几点钟执行任务
JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: package com.pcitc.time; import j ...
随机推荐
- Python性能分析与优化PDF高清完整版免费下载|百度云盘
百度云盘|Python性能分析与优化PDF高清完整版免费下载 提取码:ubjt 内容简介 全面掌握Python代码性能分析和优化方法,消除性能瓶颈,迅速改善程序性能! 对于Python程序员来说,仅仅 ...
- Linux的VMWare中Centos7文件权限管理chown 和 chmod
文件管理 chown chmod 1./根目录下目录功能划分 /boot/ 存放系统启动程序菜单及核心 --可以单独使用文件系统 /etc/ 存放系统中所有配置文件 /bin/ ...
- 07 . ELK Stack一键多机部署脚本
一键部署脚本 目录结构 tree Log_Analysis_Platform_Document Log_Analysis_Platform_Document ├── InstallES.sh ├── ...
- 00-java语言概述
1.基础常识软件:即一系列按照特定顺序组织的计算机数据和指令的集合.分为:系统软件 和 应用软件 系统软件:windows , mac os , linux ,unix,android,ios,... ...
- 调用thrift出现No handlers could be found for logger "thrift.transport.TSocket"
1.问题 使用thrift版本为0.10,在0.8没有这个问题 其中ncTAgent是代码中封装的thrift接口的结构,在thrift服务端没有启动的时候,应该拋错为连接不到.但是拋错的堆栈输出之前 ...
- Spring Security学习笔记一
一.使用Spring Security 1.在pom 文件中添加Spring Security的依赖. <dependency> <groupId>org.springfram ...
- 我给这个Python库打101分!
日志在开发过程中是一种被很多程序员 不重视 ,但是却 至关重要 的一项功能. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案 ...
- Java—匿名对象/内部类/访问修饰符/代码块
匿名对象 匿名对象是指创建对象时,只有创建对象的语句,却没有把对象地址值赋值给某个变量. //创建一个普通对象 Person p = new Person(); //创建一个匿名对象 new Pers ...
- C#LeetCode刷题之#349-两个数组的交集(Intersection of Two Arrays)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4042 访问. 给定两个数组,编写一个函数来计算它们的交集. 输入 ...
- C#算法设计之知识储备
前言 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/669 访问. 算法的讨论具有一定的规则,其中也包含一些不成文的约定 ...