目前市面上有诸多的产品实现队列功能,比如Redis、MemCache等...
其实c#中也有一个基础的集合类专门用来实现生产/消费模式 (生产模式还是建议使用Redis等产品)

下面是官方的一些资料和介绍:

BlockingCollection 是一个线程安全集合类,可提供以下功能:

  • 实现制造者-使用者模式。

  • 通过多线程并发添加和获取项。

  • 可选最大容量。

  • 集合为空或已满时通过插入和移除操作进行阻塞。

  • 插入和移除“尝试”操作不发生阻塞,或在指定时间段内发生阻塞。

  • 封装实现 IProducerConsumerCollection 的任何集合类型

  • 使用取消标记执行取消操作。

  • 支持使用 foreach(在 Visual Basic 中,使用 For Each)的两种枚举:

    • 只读枚举。

    • 在枚举项时将项移除的枚举。

BlockingCollection 支持限制和阻塞。 限制意味着可以设置集合的最大容量。 限制在某些情况中很重要,因为它使你能够控制内存中的集合的最大大小,并可阻止制造线程移动到离使用线程前方太远的位置。

可以看到该类是完全线程安全的,因此用来做生产/消费是非常合适的

如下代码演示了该类在异步环境中很好的执行着生产和消费任务

using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Globalization;
using System.Threading;
using System.Threading.Tasks;
using Xunit;namespace AsyncLearning
{public class TestProduceAndConsumer{/// <summary>/// BlockingCollection是线程安全的集合类型,支持多线程同时读写/// </summary>private readonly BlockingCollection<string> _blockingQueue =new BlockingCollection<string>();private void Produce(){for (int i = 0; i < 10; i++) //限制生产1000次{var now = DateTime.Now.ToString(CultureInfo.InvariantCulture);Debug.WriteLine($"第{i+1}次生产! {now}");_blockingQueue.Add(now);Thread.Sleep(1000);  //特意减慢生产过程以至于不会太快。。。方便演示}_blockingQueue.CompleteAdding(); //标记生产完成}private void Consume(){int i = 1;while (!_blockingQueue.IsCompleted){var x = _blockingQueue.Take();Debug.WriteLine($"第{i}次消费 {x}");i++;Thread.Sleep(2000);  //故意减慢消费}}[Fact]public void Test(){Task.WaitAll(Task.Run(() => { Produce(); }), Task.Run(() => { Consume(); }));}}
}

  

输出如下:

可见Demo很好的按照设定执行了代码逻辑,由于故意设定了不同的sleep时间,可以看到消费是晚于生产的,而消费全部完成后本Demo的任务全部结束

转载于:https://www.cnblogs.com/linkanyway/p/produce-consume-task-async.html

异步简析之BlockingCollection实现生产消费模式相关推荐

  1. 基于libmad库的MP3解码简析

    基于libmad库的MP3解码简析  MAD (libmad)是一个开源的高精度 MPEG 音频解码库,支持 MPEG-1(Layer I, Layer II 和 LayerIII(也就是 MP3). ...

  2. Android Handler与Looper原理简析

    一直感觉自己简直就是一个弱智,最近越来越感觉是这样了,真的希望自己有一天能够认同自己,认同自己. 本文转载于:https://juejin.im/post/59083d7fda2f60005d14ef ...

  3. Linux内核引导简析

    bootsect.S.setup.S.head.S分析 收藏 2010-01-14 13:36:34 bootsect.S,系统引导程序,一般不超过512字节. 在PC系统结构中,线性地址0xA000 ...

  4. Retrofit网络请求框架使用简析——Android网络请求框架(四)

    题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...

  5. AsyncTask 源码流程简析

    参考链接: https://blog.csdn.net/lmj623565791/article/details/38614699 AsyncTask的几个重要函数和参数 AsyncTask是一个抽象 ...

  6. Linux信号处理简析

    1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺. 2. 分析背景 本文基于 ARM32 架构 + Linux 4.14 内核源码进行分析. 3. 信号概述 3 ...

  7. Unity3d资源反编译. AssetBundle格式简析+简单应用+爬坑

    ===================  Unity3d资源反编译工具 DisUnity ================ 源码:https://github.com/ata4/disunity 需要 ...

  8. 精益质量管理简析(转载)

    精益质量管理简析(转载) 精益质量管理简析 http://www.quality-world.cn/guanli/2741.html 精益质量管理就是在对关键质量数据的定量化分析基础上,综合运用多种知 ...

  9. 发那科机器人plc电池_FANUC机器人维修保养故障简析

    原标题:FANUC机器人维修保养故障简析 安全操作规程 1.示教和手动机器人 1)请不要带者手套操作示教盘和操作盘. 2)在点动操作机器人时要采用较低的倍率速度以增加对机器人的控制机会. 3)在按下示 ...

最新文章

  1. 前端代码标准最佳实践:HTML篇
  2. 递归和非递归实现二叉排序树(BST)的查找操作
  3. 设计模式初探之设计模式六大原则(4):接口隔离原则
  4. h5 修改title 微信_微信h5网页自定义分享(标题、描述、图标)
  5. 做程序员的纠结在哪里
  6. listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...
  7. add.attribute向前端传_前端知识-概念篇
  8. 滴滴 AI Labs 负责人叶杰平因个人原因即将离职!CTO 张博接任
  9. Bar函数--Matplotlib
  10. 以下哪些可以成为html文件的扩展名_今天在我的visual studio code里装了以下插件,现在用着很爽...
  11. 如何通过C#开发调用Skyline软件中提供的小工具
  12. c语言数组文曲星猜数游戏编程,文曲星“猜数字”游戏的计算机模拟 —— 算法分析与实现...
  13. An Introduction to Pairing-Based Cryptography学习笔记
  14. Codeforces 868C - Qualification Rounds 思维
  15. vhs预设_如何在Linux中数字化VHS磁带
  16. JVM 常用配置参数(Java 8)
  17. 程序设计竞赛学习总结
  18. 金山词霸的字典引擎接口
  19. 小酌重构系列[10]——分离职责
  20. 如何安装adb(Android Debug Bridge)

热门文章

  1. python教程-做个淘宝双十一满减攻略
  2. python flask高级编程之restful_flask-restful使用总结
  3. mysql数据库应用的权限层级_涂抹MySQL--第5章 MySQL数据库中的权限体系 - 5.3权限级别(1)...
  4. 告别CNN?计算机视觉也用上Transformer了
  5. 从学习 Paddle 开始学习深度学习
  6. 音游android平板,音游专题 - 有时候听歌远远不够,试试这些音游吧 - Android 应用 - 【最美应用】...
  7. oracle百分比变成小数,oracle中计算百分比,并同时解决小数点前0不显示的问题...
  8. maven添加本地包命令mvn install:install-file
  9. selenium元素定位之 动态id, class元素定位
  10. C++语言实现-邻接矩阵