using System;
using System.Threading;
using System.Collections.Generic; class ProducerConsumerQueue : IDisposable
{
EventWaitHandle _wh = new AutoResetEvent (false);
Thread _worker;
readonly object _locker = new object();
Queue<string> _tasks = new Queue<string>(); public ProducerConsumerQueue()
{
_worker = new Thread (Work);
_worker.Start();
} public void EnqueueTask (string task)
{
lock (_locker) _tasks.Enqueue (task);
_wh.Set();
} public void Dispose()
{
EnqueueTask (null); // 通知消费者退出
_worker.Join(); // 等待消费者线程完成执行
_wh.Close(); // 释放所有系统资源
} void Work()
{
while (true)
{
string task = null;
lock (_locker)
if (_tasks.Count > )
{
task = _tasks.Dequeue();
if (task == null) return;
}
if (task != null)
{
Console.WriteLine ("Performing task: " + task);
Thread.Sleep (); // 模拟执行工作...
}
else
_wh.WaitOne(); // 没有任务了,等待信号
}
}
}
//为保证线程安全,我们使用了一个锁来保护对Queue<string>的访问。在Dispose方法中,我们也显式关闭了等待句柄,因为在程序生命周期中,有可能会创建和销毁许多这个类的实例。
下边是测试这个队列的主方法:
static void Main()
{
using (ProducerConsumerQueue q = new ProducerConsumerQueue())
{
q.EnqueueTask ("Hello");
for (int i = ; i < ; i++) q.EnqueueTask ("Say " + i);
q.EnqueueTask ("Goodbye!");
} // 使用 using 语句结束时会调用 q 的 Dispose 方法
// 该方法向队列中插入一个 null 的任务,并等待消费者完成退出。
}
输出结果:
Performing task: Hello
Performing task: Say
Performing task: Say
Performing task: Say
...
...
Performing task: Say
Goodbye!

最新文章

  1. Android属性动画源代码解析(超详细)
  2. Selenium2学习-004-WebUI自动化实战实例-002-百度登录
  3. Subsequence poj 3061 二分(nlog n)或尺取法(n)
  4. public, protected, private, internal, protected internal简析
  5. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router
  6. Golang struct结构
  7. 用Java编写第一个区块链
  8. Python字符串与格式化的一点用法
  9. C#绘图:带背景,拖鼠标画矩形和直线
  10. jquery抓娃娃机代码
  11. JavaScript之Ajax(一)创建Ajax对象
  12. Copycat - StateMachine
  13. PHP 判断括号是否闭合
  14. struts2的result的类型配置简介
  15. 【JAVA】通过URLConnection/HttpURLConnection发送HTTP请求的方法(一)
  16. TP3.2中filed和find()使用
  17. 《Effective Java》读书笔记五(枚举和注解)
  18. JS获取今天年月日
  19. python模块详解 re
  20. applicationContext-datasource.xml

热门文章

  1. AttributeTargets 枚举
  2. [HTML5]原生事件绑定和jquery动态事件绑定的区别
  3. OFBIZ:启动之ContainerLoader
  4. Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)
  5. 五、selecting with the API
  6. autoit 中_GUICtrlStatusBar_SetBkColor失效的解决办法
  7. [js] js和C# 时间日期格式转换
  8. iptables-qos-tcpcopy-tc-tcpdump
  9. PIC32MZ tutorial -- Hello World
  10. Java IO流体系中常用的流分类