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. 为什么要学习php

    前言: 有的人说java是世界上最伟大的编程语言,也有人说php是最伟大的编程语言,对于这个问题的争论,貌似一直都没有停息过. 前段时间也看过一份编程语言使用排行的调查资料,java当仁不让的保持着排 ...

  2. 利用Python和webhook实现自动提交代码

    最近在为公司书写项目的api文档,计划利用码云的wiki管理整个项目,公司自有git作为项目内容依托,这样全员都可参与,而我定期向码云推送就可以了. 问题 根据需求遇见了这样一个问题:我每次从git上 ...

  3. 二叉树的层次遍历 · Binary Tree Level Order Traversal

    [抄题]: 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) [思维问题]: [一句话思路]: 用queue存每一层 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况 ...

  4. 复制带随机指针的链表 · Copy List with Random Pointer

    [抄题]: 给出一个链表,每个节点包含一个额外增加的随机指针可以指向链表中的任何节点或空的节点. 返回一个深拷贝的链表. [思维问题]: [一句话思路]: 完完全全地复制,否则不好操作. 1-> ...

  5. ios 工具大全,最全框架

    https://www.jianshu.com/p/e280f3348156 [链接]文件分享 - 网盘分享https://share.weiyun.com/5A1aura

  6. 4-计算九位数以内各个位数字和为s的种类

    /*假设我们当前要求的是100以内各位数之和和等于s的数有多少个,可以想到就是10以内各位数之和等于s的数的个数再加上10到100内的各位数之和等于s的个数.令dp[i][j]就代表10的j次方内各位 ...

  7. Linux下Google Test (GTest)测试环境搭建步骤

    1.下载GTEST 下载链接为:https://code.google.com/p/googletest/downloads/list 目前GTEST的最新版本为gtest-1.7.0.zip,因此我 ...

  8. Golang之时间、日期类型

    孤身只影的一直小地鼠,艰难的走在路上 package main import ( "fmt" "time" ) //获取时间的格式 func testTime( ...

  9. BZOJ1106[POI2007]立方体大作战tet - 树状数组

    描述 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个不同的编号,每个编 ...

  10. 3、基本的Get和Post访问(含代理请求)

    Get方式访问 HttpClient hc = new DefaultHttpClient(); HttpUriRequest request = new HttpGet("http://w ...