1. using System;
  2. using System.Threading;
  3. using System.Collections.Generic;
  4.  
  5. class ProducerConsumerQueue : IDisposable
  6. {
  7. EventWaitHandle _wh = new AutoResetEvent (false);
  8. Thread _worker;
  9. readonly object _locker = new object();
  10. Queue<string> _tasks = new Queue<string>();
  11.  
  12. public ProducerConsumerQueue()
  13. {
  14. _worker = new Thread (Work);
  15. _worker.Start();
  16. }
  17.  
  18. public void EnqueueTask (string task)
  19. {
  20. lock (_locker) _tasks.Enqueue (task);
  21. _wh.Set();
  22. }
  23.  
  24. public void Dispose()
  25. {
  26. EnqueueTask (null); // 通知消费者退出
  27. _worker.Join(); // 等待消费者线程完成执行
  28. _wh.Close(); // 释放所有系统资源
  29. }
  30.  
  31. void Work()
  32. {
  33. while (true)
  34. {
  35. string task = null;
  36. lock (_locker)
  37. if (_tasks.Count > )
  38. {
  39. task = _tasks.Dequeue();
  40. if (task == null) return;
  41. }
  42. if (task != null)
  43. {
  44. Console.WriteLine ("Performing task: " + task);
  45. Thread.Sleep (); // 模拟执行工作...
  46. }
  47. else
  48. _wh.WaitOne(); // 没有任务了,等待信号
  49. }
  50. }
  51. }
  52. //为保证线程安全,我们使用了一个锁来保护对Queue<string>的访问。在Dispose方法中,我们也显式关闭了等待句柄,因为在程序生命周期中,有可能会创建和销毁许多这个类的实例。
  53. 下边是测试这个队列的主方法:
  54. static void Main()
  55. {
  56. using (ProducerConsumerQueue q = new ProducerConsumerQueue())
  57. {
  58. q.EnqueueTask ("Hello");
  59. for (int i = ; i < ; i++) q.EnqueueTask ("Say " + i);
  60. q.EnqueueTask ("Goodbye!");
  61. }
  62.  
  63. // 使用 using 语句结束时会调用 q 的 Dispose 方法
  64. // 该方法向队列中插入一个 null 的任务,并等待消费者完成退出。
  65. }
  66. 输出结果:
  67. Performing task: Hello
  68. Performing task: Say
  69. Performing task: Say
  70. Performing task: Say
  71. ...
  72. ...
  73. Performing task: Say
  74. Goodbye!

使用事件等待句柄EventWaitHandler 实现生产者、消费者队列的更多相关文章

  1. C# 实现生产者消费者队列

    开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其保存在数据库中. 1 2 3 4 5 6 7 8 9 10 private void FetchData() {} pri ...

  2. C# 实现生产者消费者队列 (转)

    按语:按照下面文档,测试成功: https://www.cnblogs.com/samgk/p/4772806.html 开发过程中经常会碰到这样的场景:需要从一个地方获取一些数据,然后处理数据并将其 ...

  3. 转(C# 实现生产者消费者队列)

    class Program { // 任务队列 static Queue<string> _tasks = new Queue<string>(); // 为保证线程安全,使用 ...

  4. 用Java写一个生产者-消费者队列

    生产者消费者的模型作用 通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用. 解耦,这是生产者消费者模型附带的作用,解耦意味着生产者和消费者之间的联系 ...

  5. Java多线程14:生产者/消费者模型

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  6. java ReentrantLock结合条件队列 实现生产者-消费者模式 以及ReentratLock和Synchronized对比

    package reentrantlock; import java.util.ArrayList; public class ProviderAndConsumerTest { static Pro ...

  7. Java 学习笔记 使用synchronized实现生产者消费者模式

    说明 Object.wait()使当前的线程进入到等待状态(进入到等待队列) Object.notifyAll() 唤醒等待中的全部线程 Object.notify() 随机唤醒一个线程 代码 con ...

  8. java多线程15 :wait()和notify() 的生产者/消费者模式

    什么是生产者/消费者模型 一种重要的模型,基于等待/通知机制.生产者/消费者模型描述的是有一块缓冲区作为仓库,生产者可将产品放入仓库,消费者可以从仓库中取出产品,生产者/消费者模型关注的是以下几个点: ...

  9. 生产者-消费者问题:介绍POSIX线程的互斥量和条件变量的使用

    全局初始化互斥量和条件变量(不全局也行,但至少要对线程启动函数可见,这样才能使用.) static pthread_cont_t cond = PTHREAD_COND_INITIALIZER; st ...

随机推荐

  1. IOS中图片拉伸技巧与方法总结(转载)

    以下内容转载自:http://my.oschina.net/u/2340880/blog/403996 IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是 ...

  2. vim全选,全部复制,全部删除

    全选(高亮显示):按esc后,然后ggvG或者ggVG 全部复制:按esc后,然后ggyG 全部删除:按esc后,然后dG 解析: gg:是让光标移到首行,在vim才有效,vi中无效 v : 是进入V ...

  3. Codeforces Round #376 (Div. 2) C题 Socks(dsu+graphs+greedy)

    Socks Problem Description: Arseniy is already grown-up and independent. His mother decided to leave ...

  4. [Tex学习笔记]矩阵输入中的省略号

    \usepackage{enumerate,mathdots} $\iddots$

  5. CRM合并事件

    1 Only account, contact, lead, incident entities are supported for merge 2 Merging Custom Entity Rec ...

  6. 33. Minimum Depth of Binary Tree && Balanced Binary Tree && Maximum Depth of Binary Tree

    Minimum Depth of Binary Tree OJ: https://oj.leetcode.com/problems/minimum-depth-of-binary-tree/ Give ...

  7. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

    今天碰到了一个查询异常问题,上网查了一下,感谢原创和译者 如果你使用的数据库连接类是 the Data Access Application Blocks "SqlHelper" ...

  8. 数据结构中很常见的各种树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B+树.B*树) 二叉排序树.平衡树.红黑树 红黑树----第四篇:一步一图一代码,一定要让你真正彻底明白红黑树 --- ...

  9. div高度自适应(父元素未知,所有高度跟随子元素最大的高度)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. mongodb账号安全操作

    安装服务 mongod --install --serviceName mongodb --storageEngine=mmapv1 --dbpath i:\mongodb\data --journa ...