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#封装定时执行任务类的更多相关文章

  1. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,本文记录免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作 ...

  2. 使用System.Timers.Timer类实现程序定时执行

    使用System.Timers.Timer类实现程序定时执行 在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和Sys ...

  3. 定时执行任务-springboot

    定时执行任务-springboot 先看两个接口 这两个接口springboot已经帮我们封装好了,我们不需要去手动使用 TaskScheduler //任务调度者 TaskExecutor //任务 ...

  4. linux定时执行任务crontab命令用法

    linux系统的定时任务是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于使用者自己也可以设置计划任务,所 ...

  5. 基于ASP.NET MVC定时执行任务调度

    相对FluentScheduler实现定时调度任务的使用简单,配置少的特点,Quartz.Net则配置稍微复杂一些.下面我们就接合一个 ASP.NET MVC网站应用程序的定时执行任务调试的小实例来了 ...

  6. Java 在某一个时间点定时执行任务(转载)

    java定时任务,每天定时执行任务.以下是这个例子的全部代码. public class TimerManager { //时间间隔 private static final long PERIOD_ ...

  7. 【ASP.NET 进阶】定时执行任务实现 (定时读取和修改txt文件数字内容,无刷新显示结果)

    现在有很多网站或系统需要在服务端定时做某件事情,如每天早上8点半清理数据库中的无效数据等等,Demo 具体实现步骤如下: 0.先看解决方案截图 1.创建ASP.NET项目TimedTask,然后新建一 ...

  8. 【ASP.NET 进阶】定时执行任务

    原理:利用全局应用程序类 Global.asax 和 System.Timers.Timer  类定时处理任务. 示例效果图: 其 Global.asax 类代码如下: using System; u ...

  9. JAVA定时执行任务,每天定时几点钟执行任务

    JAVA定时执行任务,每天定时几点钟执行任务的示例如下: 1.建立TimerManage类,设置时间点,时间点设置的管理类,代码如下: package com.pcitc.time; import j ...

随机推荐

  1. PHP parse_ini_file() 函数

    定义和用法 parse_ini_file() 函数解析一个配置文件(ini 文件),并以数组的形式返回其中的设置. 语法 parse_ini_file(file,process_sections) 参 ...

  2. mit-6.828 Lab01:Booting a PC exercise1.1

    Lab01:Booting a PC 目录 Lab01:Booting a PC JOS BIOS 背景知识 8086的基本知识 GDB 常用调试指令 Real mode && Pro ...

  3. Linux的VMWare14中配置Centos7桥接网络环境(网络一)

    1.查看当前初始环境如下:在windows端先查看本机ip   ifconfig

  4. Web优化躬行记(3)——图像和网络

    一.图像 1)响应式图像 浏览器根据屏幕大小.设备像素比.横竖屏自动加载合适的图像. 响应式的功能可以通过srcset和sizes两个新属性实现. 前者可指定选择的图像以及其大小,后者会定义一组媒体条 ...

  5. 「MoreThanJava」Day 4:面向对象基础

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  6. 012_go语言中的Functions 函数

    代码演示 package main import "fmt" func plus(a int, b int) int { return a + b } func plusPlus( ...

  7. GCN 入门

    参考链接: https://www.zhihu.com/question/54504471/answer/611222866 1 拉普拉斯矩阵 参考链接: http://bbs.cvmart.net/ ...

  8. Catalina 默认使用zsh了,你可习惯

    zsh 成为默认 shell 淘汰掉我的旧MBP换新后,欢天喜地打开Terminal,感觉有点不对,提示符什么时候变成了 %. 查询了一些资料发现,原来在2019年WWDC期间,苹果推出了macOS ...

  9. java 接口二

    一 接口的多实现 接口最重要的体现:解决多继承的弊端.将多继承这种机制在java中通过多实现完成了. interface Fu1 { void show1(); } interface Fu2 { v ...

  10. golang 整型

    目录 前言 整型 1.分类 2.类型 3.类型补充 4.补充: 跳转 前言 不做文字的搬运工,多做灵感性记录 这是平时学习总结的地方,用做知识库 平时看到其他文章的相关知识,也会增加到这里 随着学习深 ...