C# 定时器和队列结合,卖包子啦,Timer、 AutoResetEvent、 ManualResetEvent
再你们得到源码之前,我先做个广告:张家港杰德机械/张家港三兴华轩机械是我一朋友的公司,希望需要做净水,灌装机,拔盖机,封口机,传送带等的朋友光顾。
张家港杰德机械有限公司:http://www.jiedejx.com
张家港三兴华轩机械厂:http://huaxuancch.com
OK ,开始卖包子
本程序用到队列,定时器,很简单,没什么好说的,因为用得到,所以作个记录:
如下:

class Program
{
/// <summary>
/// 本篇示例 讲解C#队列 入队 和 定时出队,例如:早上排队买包子 设置为每隔五秒,买包子成功排队的人出队!
/// </summary>
/// <param name="args">@陈卧龙 张家港杰德机械、张家港华轩机械:http://www.huaxuancch.com http://www.jiedejx.com </param> /// <summary>
/// 全局队列
/// </summary>
public static ConcurrentQueue<Person> _ConcurrenPersons = new ConcurrentQueue<Person>();
static void Main(string[] args)
{
//模拟入队
Person model1 = new Person("宋江", "男", );
Person model2 = new Person("李逵", "男", );
Person model3 = new Person("顾大嫂", "女", );
Person model4 = new Person("扈三娘", "女", );
Person model5 = new Person("一丈青", "女", );
Person model6 = new Person("林冲", "男", );
Person model7 = new Person("武松", "男", );
Person model8 = new Person("花和尚", "男", );
List<Person> listPerson = new List<Person>();
listPerson.Add(model1);
listPerson.Add(model2);
listPerson.Add(model3);
listPerson.Add(model4);
listPerson.Add(model5);
listPerson.Add(model6);
listPerson.Add(model7);
listPerson.Add(model8);
foreach (var item in listPerson)
{
//开始排队
PersonEnqueue(item);
}
//排队完成
//
//注册Timer 在web项目中可以在 ApplicationStart 或者 静态构造函数中注册
Time_Task.Instance().ExecuteTask += new System.Timers.ElapsedEventHandler(ExecuteTask);
Time_Task.Instance().Interval = * ;//表示间隔 5秒钟执行一次
Time_Task.Instance().Start();
//
Console.WriteLine("店小二:都别吵,都别吵,再等五秒钟开始卖包子。5 4 3 2 1 ...");
Console.ReadKey();
} /// <summary>
/// 入队
/// </summary>
public static void PersonEnqueue(Person Model)
{
_ConcurrenPersons.Enqueue(Model);
} /// <summary>
/// 定时执行出队操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void ExecuteTask(object sender, System.Timers.ElapsedEventArgs e)
{
PersonDequeue();
} /// <summary>
/// 出队
/// </summary>
public static void PersonDequeue()
{
if (_ConcurrenPersons.Count > )
{
bool dequeueSuccesful = false;
bool peekSuccesful = false;
Person workItem; peekSuccesful = _ConcurrenPersons.TryPeek(out workItem); if (peekSuccesful)
{
dequeueSuccesful = _ConcurrenPersons.TryDequeue(out workItem);//出队
Console.WriteLine("大家好,我叫" + workItem.uName + ",今年" + workItem.uAge + "岁,一大早的就叫老子排队买包子,总算买完了!" + " " + DateTime.Now);
}
}
else
{
Console.WriteLine("队列里没人了............");
}
}
} public class Time_Task
{
public event System.Timers.ElapsedEventHandler ExecuteTask; private static readonly Time_Task _task = null;
private System.Timers.Timer _timer = null; //定义时间
private int _interval = *;
public int Interval
{
set
{
_interval = value;
}
get
{
return _interval;
}
} static Time_Task()
{
_task = new Time_Task();
} public static Time_Task Instance()
{
return _task;
} //开始
public void Start()
{
if (_timer == null)
{
_timer = new System.Timers.Timer(_interval);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Enabled = true;
_timer.Start();
}
} protected void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (null != ExecuteTask)
{
ExecuteTask(sender, e);
}
} //停止
public void Stop()
{
if (_timer != null)
{
_timer.Stop();
_timer.Dispose();
_timer = null;
}
} } /// <summary>
/// 排队的人实体
/// </summary>
public class Person
{
public Person(string N,string S,int A)
{
uName = N;
uSex = S;
uAge = A;
}
public string uName { get; set; }
public string uSex { get; set; }
public int uAge { get; set; }
}
@陈卧龙的博客
未完持续......
如果我们换种思路,定时器一秒钟执行一次,但,每次卖包子用时还是五秒,我们应当怎么办?这样修改的好处时,用户来了,就可以直接买包子,而不用多等五秒,同理,这一波买包子的人走了后,后续来的人也不需要多等待这个五秒!
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace Test2
{
class Program
{
/// <summary>
/// 本篇示例 讲解C#队列 入队 和 定时出队,例如:早上排队买包子 设置为每隔五秒,买包子成功排队的人出队!
/// </summary>
/// <param name="args">@陈卧龙 张家港杰德机械、张家港华轩机械:http://www.huaxuancch.com http://www.jiedejx.com </param> /// <summary>
/// 全局队列
/// </summary>
public static ConcurrentQueue<Person> _ConcurrenPersons = new ConcurrentQueue<Person>(); static Program()
{
Time_Task.Instance().ExecuteTask += new System.Timers.ElapsedEventHandler(ExecuteTask);
Time_Task.Instance().Interval = * ;//修改成每隔一秒执行一次
Time_Task.Instance().Start();
}
static void Main(string[] args)
{
Console.WriteLine("店小二:都别吵,都别吵,现在马上开始卖包子 ...");
//模拟入队
Person model1 = new Person("宋江", "男", );
Person model2 = new Person("李逵", "男", );
Person model3 = new Person("顾大嫂", "女", );
Person model4 = new Person("扈三娘", "女", );
Person model5 = new Person("一丈青", "女", );
Person model6 = new Person("林冲", "男", );
Person model7 = new Person("武松", "男", );
Person model8 = new Person("花和尚", "男", );
List<Person> listPerson = new List<Person>();
listPerson.Add(model1);
listPerson.Add(model2);
listPerson.Add(model3);
listPerson.Add(model4);
listPerson.Add(model5);
listPerson.Add(model6);
listPerson.Add(model7);
listPerson.Add(model8);
foreach (var item in listPerson)
{
//开始排队
PersonEnqueue(item);
}
//排队完成 Console.ReadKey();
} /// <summary>
/// 入队
/// </summary>
public static void PersonEnqueue(Person Model)
{
_ConcurrenPersons.Enqueue(Model);
} /// <summary>
/// 定时执行出队操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void ExecuteTask(object sender, System.Timers.ElapsedEventArgs e)
{
PersonDequeue();
} /// <summary>
/// 出队
/// </summary>
public static void PersonDequeue()
{
if (_ConcurrenPersons.Count > )
{
bool dequeueSuccesful = false;
bool peekSuccesful = false;
Person workItem;
Time_Task.Instance().Stop();
peekSuccesful = _ConcurrenPersons.TryPeek(out workItem); if (peekSuccesful)
{
Console.WriteLine("大家好,我叫" + workItem.uName + ",今年" + workItem.uAge + "岁,一大早的就叫老子排队买包子,总算买完了!" + " " + DateTime.Now);
Thread.Sleep();
dequeueSuccesful = _ConcurrenPersons.TryDequeue(out workItem);//出队
}
Time_Task.Instance().Start();
}
else
{
Console.WriteLine("队列里没人了,我要关闭定时器啦............");
Time_Task.Instance().Stop();
}
}
} public class Time_Task
{
public event System.Timers.ElapsedEventHandler ExecuteTask; private static readonly Time_Task _task = null;
private System.Timers.Timer _timer = null; //定义时间
private int _interval = *;
public int Interval
{
set
{
_interval = value;
}
get
{
return _interval;
}
} static Time_Task()
{
_task = new Time_Task();
} public static Time_Task Instance()
{
return _task;
} //开始
public void Start()
{
if (_timer == null)
{
_timer = new System.Timers.Timer(_interval);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Enabled = true;
_timer.Start();
}
} protected void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (null != ExecuteTask)
{
ExecuteTask(sender, e);
}
} //停止
public void Stop()
{
if (_timer != null)
{
_timer.Stop();
_timer.Dispose();
_timer = null;
}
} } /// <summary>
/// 排队的人实体
/// </summary>
public class Person
{
public Person(string N,string S,int A)
{
uName = N;
uSex = S;
uAge = A;
}
public string uName { get; set; }
public string uSex { get; set; }
public int uAge { get; set; }
}
}
案例2,如下:又来了一波买包子的人,
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace Test2
{
class Program
{
/// <summary>
/// 本篇示例 讲解C#队列 入队 和 定时出队,例如:早上排队买包子 设置为每隔五秒,买包子成功排队的人出队!
/// </summary>
/// <param name="args">@陈卧龙 张家港杰德机械、张家港华轩机械:http://www.huaxuancch.com http://www.jiedejx.com </param> /// <summary>
/// 全局队列
/// </summary>
public static ConcurrentQueue<Person> _ConcurrenPersons = new ConcurrentQueue<Person>(); static Program()
{
Time_Task.Instance().ExecuteTask += new System.Timers.ElapsedEventHandler(ExecuteTask);
Time_Task.Instance().Interval = * ;//修改成每隔一秒执行一次
Time_Task.Instance().Start();
}
static void Main(string[] args)
{
Console.WriteLine("店小二:都别吵,都别吵,现在马上开始卖包子 ...");
//模拟入队
Person model1 = new Person("宋江", "男", );
Person model2 = new Person("李逵", "男", );
List<Person> listPerson = new List<Person>();
listPerson.Add(model1);
listPerson.Add(model2);
foreach (var item in listPerson)
{
//开始排队
PersonEnqueue(item);
}
//排队完成
Thread.Sleep();
AginEnque();// 又来了一波买包子的人
Console.ReadKey();
} /// <summary>
/// 又来了一波买包子的人
/// </summary>
public static void AginEnque()
{
Console.WriteLine("又有一波买包子的人来了......");
List<Person> listPerson = new List<Person>();
listPerson.Clear();
Person model1 = new Person("刘备", "男", );
Person model2 = new Person("关羽", "男", );
Person model3 = new Person("张飞", "男", );
listPerson.Add(model1);
listPerson.Add(model2);
listPerson.Add(model3);
foreach (var item in listPerson)
{
//第二次开始排队
PersonEnqueue(item);
}
Time_Task.Instance().Start();
} /// <summary>
/// 入队
/// </summary>
public static void PersonEnqueue(Person Model)
{
_ConcurrenPersons.Enqueue(Model);
} /// <summary>
/// 定时执行出队操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void ExecuteTask(object sender, System.Timers.ElapsedEventArgs e)
{
PersonDequeue();
} /// <summary>
/// 出队
/// </summary>
public static void PersonDequeue()
{
if (_ConcurrenPersons.Count > )
{
bool dequeueSuccesful = false;
bool peekSuccesful = false;
Person workItem;
Time_Task.Instance().Stop();
peekSuccesful = _ConcurrenPersons.TryPeek(out workItem); if (peekSuccesful)
{
Console.WriteLine("大家好,我叫" + workItem.uName + ",今年" + workItem.uAge + "岁,一大早的就叫老子排队买包子,总算买完了!" + " " + DateTime.Now);
Thread.Sleep();
dequeueSuccesful = _ConcurrenPersons.TryDequeue(out workItem);//出队
}
Time_Task.Instance().Start();
}
else
{
Console.WriteLine("队列里没人了,我要关闭定时器啦............");
Time_Task.Instance().Stop();
}
}
} public class Time_Task
{
public event System.Timers.ElapsedEventHandler ExecuteTask; private static readonly Time_Task _task = null;
private System.Timers.Timer _timer = null; //定义时间
private int _interval = *;
public int Interval
{
set
{
_interval = value;
}
get
{
return _interval;
}
} static Time_Task()
{
_task = new Time_Task();
} public static Time_Task Instance()
{
return _task;
} //开始
public void Start()
{
if (_timer == null)
{
_timer = new System.Timers.Timer(_interval);
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Enabled = true;
_timer.Start();
}
} protected void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (null != ExecuteTask)
{
ExecuteTask(sender, e);
}
} //停止
public void Stop()
{
if (_timer != null)
{
_timer.Stop();
_timer.Dispose();
_timer = null;
}
} } /// <summary>
/// 排队的人实体
/// </summary>
public class Person
{
public Person(string N,string S,int A)
{
uName = N;
uSex = S;
uAge = A;
}
public string uName { get; set; }
public string uSex { get; set; }
public int uAge { get; set; }
}
}
未完持续...
如果我们不使用定时器,该怎么写呢?
不使用定时器时,我们可以使用C#的信号量机制,所谓信号量机制请参考鄙人写的博客:C#深入理解AutoResetEvent和ManualResetEvent 。
具体怎么实现,看下面代码:
class Program
{
/// <summary>
/// 本篇示例 讲解C#队列 入队 和 定时出队,例如:早上排队买包子 设置为每隔五秒,买包子成功排队的人出队!
/// </summary>
/// <param name="args">@陈卧龙 张家港杰德机械、张家港华轩机械:http://www.huaxuancch.com http://www.jiedejx.com </param> /// <summary>
/// 全局队列
/// </summary>
public static ConcurrentQueue<Person> _ConcurrenPersons = new ConcurrentQueue<Person>();
static AutoResetEvent myResetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
Console.WriteLine("店小二:都别吵,都别吵,再等五秒钟开始卖包子。5 4 3 2 1 ...");
Thread thread = new Thread(PersonDequeue);
thread.Name = "queue";
thread.Start();
//模拟入队
Person model1 = new Person("宋江", "男", );
Person model2 = new Person("李逵", "男", ); List<Person> listPerson = new List<Person>();
listPerson.Add(model1);
listPerson.Add(model2);
foreach (var item in listPerson)
{
//开始排队
PersonEnqueue(item);
}
// Console.ReadKey();
} /// <summary>
/// 入队
/// </summary>
public static void PersonEnqueue(Person Model)
{
_ConcurrenPersons.Enqueue(Model); myResetEvent.Set();
Thread.Sleep();
} /// <summary>
/// 出队
/// </summary>
public static void PersonDequeue()
{
while (true)
{
myResetEvent.WaitOne();
if (_ConcurrenPersons.Count > )
{
bool dequeueSuccesful = false;
bool peekSuccesful = false;
Person workItem; peekSuccesful = _ConcurrenPersons.TryPeek(out workItem); if (peekSuccesful)
{
dequeueSuccesful = _ConcurrenPersons.TryDequeue(out workItem);//出队
Console.WriteLine("大家好,我叫" + workItem.uName + ",今年" + workItem.uAge + "岁,一大早的就叫老子排队买包子,总算买完了!" + " " + DateTime.Now);
}
}
else
{
Console.WriteLine("队列里没人了............"); }
}
}
} /// <summary>
/// 排队的人实体
/// </summary>
public class Person
{
public Person(string N, string S, int A)
{
uName = N;
uSex = S;
uAge = A;
}
public string uName { get; set; }
public string uSex { get; set; }
public int uAge { get; set; }
}
@陈卧龙的博客
C# 定时器和队列结合,卖包子啦,Timer、 AutoResetEvent、 ManualResetEvent的更多相关文章
- NodeJs之定时器与队列
NodeJs之定时器与队列 一,介绍与需求 1.1,介绍 定时任务(node-schedule),是针对Node.js的一种灵活的cron-like和not-cron-like作业调度程序.它允许您使 ...
- 《Python》线程之锁、信号量、事件、条件、定时器、队列
一.锁 线程为什么要有锁: += .-= 赋值操作数据不安全(要经过取值.计算.放回值,3部操作) pop .append 都是数据安全的(只有添加和删除,一次操作) 队列也是数据安全的 1.同步锁 ...
- 7-[多线程]-Event、定时器、队列、堆栈
1.Event对象 线程的一个关键特性是每个线程都是独立运行且状态不可预测. 如果程序中的其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时线程同步问题就会变得非常棘手. 为了解决这些问题 ...
- python全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)
昨日内容回顾 线程 什么是线程? 线程是cpu调度的最小单位 进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的 ...
- muduo网络库学习笔记(三)TimerQueue定时器队列
目录 muduo网络库学习笔记(三)TimerQueue定时器队列 Linux中的时间函数 timerfd简单使用介绍 timerfd示例 muduo中对timerfd的封装 TimerQueue的结 ...
- C# 队列和栈 线程安全
队列是其元素以先进先出(FIFO)的方式来处理集合,先入队的元素会先读取. 栈是和队列非常类似的另一个容器,栈和队列最大的区别是后进先出(LIFO),也可以说成先进后出. 队列在现实生活中的例子数不胜 ...
- Day034--Python--锁, 信号量, 事件, 队列, 生产者消费者模型, joinableQueue
进程同步: 1. 锁 (重点) 锁通常被用来实现对共享资源的同步访问.为每一个共享资源创建一个Lock对象,当你需要访问该资源时,调用acquire方法来获取锁对象(如果其它线程已经获得了该锁, ...
- 多线程之----定时器TIMER
结上一篇 多线程的简单介绍 http://www.cnblogs.com/duanxiaojun/p/6595847.html 在上一讲中我主要是对多线程学习这个系列做了一个大致的学习计划,然后对 ...
- 8.12 day31 进程间通信 Queue队列使用 生产者消费者模型 线程理论 创建及对象属性方法 线程互斥锁 守护线程
进程补充 进程通信 要想实现进程间通信,可以用管道或者队列 队列比管道更好用(队列自带管道和锁) 管道和队列的共同特点:数据只有一份,取完就没了 无法重复获取用一份数据 队列特点:先进先出 堆栈特点: ...
随机推荐
- Kotlin入门(19)Android的基础布局
线性布局线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维方 ...
- 【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解
今天来介绍一下容器类中的另一个哈希表———>LinkedHashMap.这是HashMap的关门弟子,直接继承了HashMap的衣钵,所以拥有HashMap的全部特性,并青出于蓝而胜于蓝,有着一 ...
- recovery 升级界面顶部花屏问题分析
说明: 实际解决问题的过程有点曲折,后面找到原因,分析清楚问题后,总结下正确的分析方法,大致分析流程如下. 问题描述: 在进入recovery的时候,第一次上电进入recovery时,顶部会有一长条花 ...
- 在ASP.NET Core中使用多环境
原文地址:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-2.1#star ...
- Chrome 百度搜索热点过滤插件 - 开源软件
学习时,为了搜集最全的中文资料,有时候不得不使用Baidu搜索引擎.在你还是个小菜鸡的时候你可能会花费大量时间在百度上! 但是,时间久了你会发现,你总会被网络上一些奇奇怪怪或者有趣的事情吸引过去而逐渐 ...
- 5.2Python函数(二)
目录 目录 前言 (一)偏函数 ==1.说明== ==2.原代码== ==3.显示效果== (二)高阶函数 ==1.说明== ==2.源代码== ==3.运行效果== (三)返回值函数 ==1.说明= ...
- 网络编程_IP对象_InetAddress
import java.net.InetAddress; import java.net.UnknownHostException; public class IPDemo { public stat ...
- 最少拦截系统 HDU - 1257
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于 ...
- PCB
Layer Stack Manager(层堆栈管理) 用户可以通过Layer Stack Manager对话框来添加更多的层. 1.选择Design>>Layer Stack Manage ...
- Arduino IDE for ESP8266 项目(2)wifi扫描
#include "ESP8266WiFi.h" void setup() { Serial.begin(115200); //设定WiFi为STA模式,如果先前已连接上AP,则与 ...