using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Timers; namespace TestJobs
{
class Program
{
private static readonly CronMon CronMon = new CronMon();
static void Main(string[] args)
{
Start();
Console.ReadKey();
}
public static void Start()
{
CronMon.AddJob(new Job());
CronMon.AddJob(new Job());
CronMon.AddJob(new Job());
CronMon.Start();
}
}
class Job:CronJobBase
{
private int _span = ;
public Job()
{
}
public Job (int span)
:base(span)
{ this._span = span; }
protected override void Execute()
{
if (_span == )
Console.WriteLine("我是Job,我使用默认时间执行!"+DateTime.Now.ToString("s"));
else
Console.WriteLine("我是Job,我间隔{0}s执行!{1}", _span, DateTime.Now.ToString("s"));
}
} interface ICronJob
{
void Run(DateTime dateTime);
void Abort();
}
class CronJobBase : ICronJob
{
private readonly object _object = new object();
private Thread _thread;
private DateTime _runTime = DateTime.Now;
private int _span=;//时间间隔 3s
public CronJobBase()
{ }
public CronJobBase(int span)
{
_span = span;
}
public void Run(DateTime dateTime)
{
if (_thread != null && _thread.ThreadState == ThreadState.Running)
return;
if (_runTime.AddSeconds(_span) > dateTime)
return;
_runTime = dateTime;
_thread = new Thread(ExecuteHandler);
_thread.Start();
} public void Abort()
{
_thread.Abort();
}
private void ExecuteHandler()
{
try
{
Execute();
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
} protected virtual void Execute()
{ }
}
interface ICronMon
{
void AddJob(ICronJob job);
void Start();
void Stop();
}
class CronMon:ICronMon
{
private readonly System.Timers.Timer _timer = new System.Timers.Timer();
private readonly List<ICronJob> _jobs = new List<ICronJob>();
private DateTime _last = DateTime.Now; public CronMon()
{
_timer.AutoReset = true;
_timer.Elapsed+=_timer_Elapsed;
} private void _timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (DateTime.Now.Second != _last.Second)
{
_last = DateTime.Now;
foreach (var item in _jobs)
{
item.Run(DateTime.Now);
}
}
} public void AddJob(ICronJob job)
{
_jobs.Add(job);
} public void Start()
{
_timer.Start();
} public void Stop()
{
_timer.Stop();
foreach (var item in _jobs)
{
item.Abort();
}
}
}
}

c# .net中的简单Job的更多相关文章

  1. Java中的简单工厂模式

    举两个例子以快速明白Java中的简单 工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的思想里面.女娲造人,这就 ...

  2. iOS中XMPP简单聊天实现 好友和聊天

    版权声明本文由陈怀哲首发自简书:http://www.jianshu.com/users/9f2e536b78fd/latest_articles;微信公众号:陈怀哲(chenhuaizhe2016) ...

  3. WebSocket在ASP.NET MVC4中的简单实现

    WebSocket在ASP.NET MVC4中的简单实现 2013-12-21 20:48 by 小白哥哥, 810 阅读, 3 评论, 收藏, 编辑 WebSocket 规范的目标是在浏览器中实现和 ...

  4. Hangfire在ASP.NET CORE中的简单实现

    hangfire是执行后台任务的利器,具体请看官网介绍:https://www.hangfire.io/ 新建一个asp.net core mvc 项目 引入nuget包 Hangfire.AspNe ...

  5. 通过DFS求解有向图(邻接表存储)中所有简单回路

    前言 查阅了网上许多关于通过DFS算法对有向图中所有简单回路的查找,发现有很多关于使用DFS求解有向回路中所有简单回路的帖子,(在按照节点编号情况下)但大多数仅仅寻找了编号递增的回路.又或者未对结果去 ...

  6. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...

  7. 在商城系统中使用设计模式----简单工厂模式之在springboot中使用简单工厂模式

    1.前言: 不了解简单工厂模式请先移步:在商城中使用简单工厂.在这里主要是对springboot中使用简单工厂模式进行解析. 2.问题: 什么是简单工厂:它的实现方式是由一个工厂类根据传入的参数,动态 ...

  8. flask中的简单的前端写入

    那么flask这个框架是web开发,那么肯定离不开前端的一些代码,那么python用的web开发框架 开发所用的前端模板就是jinja2模板.相对于jinja1比起来性能做到了很大的提升,那么Vue一 ...

  9. Dingo Api 1.0在laravel5.2中的简单应用

    Dingo Api是为基于laravel的开发提供了一系列工具集,这些工具集可以帮助开发者快速构建API.Dingo Api最新的版本是2.0.0-alpha1,这个版本需要php7.0以上的php版 ...

  10. Jwt在Java项目中的简单实际应用

    1.什么是jwt 双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以Json对象的形式安全的传递信 ...

随机推荐

  1. win 下 nginx 与 php的配置

    1.下载需要的软件包 php的windows版本(*注意这里下载非线程安全的,nginx使用的是cgi) http://windows.php.net/download/   nginx的window ...

  2. css水波动画效果

    代码来源:http://www.jq22.com/code1526 HTML: <div class="waves"></div> css: html, b ...

  3. Debian 利用 iso 镜像完全离线更新 apt-cdrom

    1 目的 在日常的 linux 服务器管理中,出于某些考虑,服务器要求与 Internet 完全隔离. 这使得我们对系统的更新和软件包的升级感到无比头疼. 下面介绍的这种方法,采用 ISO 文件,进行 ...

  4. wcf服务契约继承

    a. 服务端 .契约 使用了继承 using System; using System.ServiceModel; namespace WCF.Chapter2.InheritanceReworked ...

  5. 运行 .jar dos 命令

    命令行进入 jar  所在文件夹 执行 java -jar  a.jar;

  6. Oracle连接字符串大全

    // 在 C# 代码中用以下数据库提供程序访问 Oracle 数据库 // Oracle Data Provider for .NET / ODP.NET 使用 TNS 写法 Data Source= ...

  7. div和span元素的区别

    2个都是用来划分区间但是没有实际语义的标签,差别就在于div是块级元素,不会其他元素在同一行;span是内联元素,可以与其他元素位于同一行. DIV 和 SPAN 元素最大的特点是默认都没有对元素内的 ...

  8. 使用delphi 开发多层应用(二十二)使用kbmMW 的认证管理器

    从kbmmw 4.4 开始,增加了认证管理器,这个比原来的简单认证提供了更多的功能.细化了很多权限操作. 今天对这一块做个介绍. 要做一个认证管理,大概分为以下5步: 1.  定义你要保护的资源,一般 ...

  9. 2018.09.01 poj3071Football(概率dp+二进制找规律)

    传送门 概率dp简单题. 设f[i][j]表示前i轮j获胜的概率. 如果j,k能够刚好在第i轮相遇,找规律可以发现j,k满足: (j−1)>>(i−1)" role=" ...

  10. 47 On Interpersonal Relationship 关于人际关系

    47 On Interpersonal Relationship 关于人际关系 ①Since we are social beings, the quality of our lives depend ...