返回顶部
首页 > 资讯 > 精选 >C#中神器类BlockingCollection怎么使用
  • 403
分享到

C#中神器类BlockingCollection怎么使用

2023-07-05 07:07:55 403人浏览 薄情痞子
摘要

本文小编为大家详细介绍“C#中神器类BlockinGCollection怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中神器类BlockingCollection怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一

本文小编为大家详细介绍“C#中神器类BlockinGCollection怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中神器类BlockingCollection怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

BlockingCollection简单介绍

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

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

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

  • 可选最大容量

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

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

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

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

  • 支持使用 foreach(在 Visual Basic 中,使用 For Each)的两种枚举:1. 只读枚举,2. 在枚举项时将项移除的枚举

起手式

BlockingCollection blockingCollection = new(1);

new 操作符里面的数字是实现了可选最大容量,超出就线程阻塞了,程序一直卡在哪里

先来个开胃菜 => 三句代码实现线程阻塞

BlockingCollection<int> blockingCollection = new(1);blockingCollection.Add(1);blockingCollection.Add(2);

说明:因为限制队列只能插入一条,第一条没有消费掉,所以一直卡在插入第二条程序不会往下继续运行实现了集合为空或已满时通过插入和移除操作进行阻塞

正式开始前先分享一些多线程的知识点

Task类简单介绍

Task 表面上是Thread但却是对ThreadPool的封装,控制和扩展性很强,对线程的延续,阻塞,取消,超时,比传统的Thread和ThreadPool强

Queue类简单介绍

队列(Queue)代表了一个先进先出的对象集合。当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队

接下来进入实际使用场景

场景一: 生产者=> 消费者

建议代码还是要动手实现一下,不然体会不到一边生产数据,同时还能取数据的神仙操作

int count = 0 ;BlockingCollection<string> blockingCollection = new(1);//生产者Task.Factory.StartNew(() =>{ while (true) {    blockingCollection.Add("String: " + count);    count++;    if (count > 10)    {     blockingCollection.CompleteAdding();    } }});//消费者Task.Factory.StartNew(() =>{ foreach (var element in blockingCollection.GetConsumingEnumerable()) {  Thread.Sleep(1000);  ("Work: " + element).Dump();//Dump 为工具Linq的功能 }});

上面的代码中这个方法GetConsumingEnumerable很重要,它可以在BlockingCollection集合有数据的时候取数据,没有的话停止取,可以达到监测的效果

这个案例实现了如下功能:

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

  • 生产者和消费者模式

  • 使用取消标记执行取消操作(让生产者知道我们已经不需要你工作了)

生产者/消费者输出结果

Work: String: 0
Work: String: 1
Work: String: 2
Work: String: 3
Work: String: 4
Work: String: 5
Work: String: 6
Work: String: 7
Work: String: 8
Work: String: 9
Work: String: 10

场景二: 实现队列FIFO(先进先出),LIFO(先进后出)

 //先进先出(FIFO) BlockingCollection<int> bc = new(new ConcurrentQueue<int>()); bc.Add(1); bc.Add(2); bc.CompleteAdding(); //先进后出(LIFO) BlockingCollection<int> bc2 = new(new ConcurrentStack<int>()); bc2.Add(1); bc2.Add(2); bc2.CompleteAdding(); bc.Take().Dump("bc1:"); bc2.Take().Dump("bc2:");

队列输出结果

bc :1 
bc2: 2

这个简单的案例是想介绍一下其实:BlockingCollection也可以实现队列的功能

读到这里,这篇“C#中神器类BlockingCollection怎么使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: C#中神器类BlockingCollection怎么使用

本文链接: https://lsjlt.com/news/350290.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#中神器类BlockingCollection怎么使用
    本文小编为大家详细介绍“C#中神器类BlockingCollection怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#中神器类BlockingCollection怎么使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一...
    99+
    2023-07-05
  • C#中神器类BlockingCollection的实现详解
    目录前言BlockingCollection简单介绍起手式接下来进入实际使用场景场景一: 生产者=> 消费者场景二: 实现队列FIFO(先进先出),LIFO(先进后出)前言 如...
    99+
    2023-02-28
    C# BlockingCollection实现 C# BlockingCollection
  • C#中类怎么使用
    这篇文章主要介绍了C#中类怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#中类怎么使用文章都会有所收获,下面我们一起来看看吧。实例化在对类进行访问时,需要将类进行实例化。并产生一个对象。可以使用关键字...
    99+
    2023-07-02
  • C#中XmlDocument类怎么使用
    XmlDocument类是 C# 中用于操作 XML 文档的类,它提供了一系列方法和属性来创建、读取、修改和保存 XML 文档。下面...
    99+
    2023-09-15
    C#
  • C++中iostringstream类怎么使用
    `ostringstream` 是C++中的一个类,它继承自 `ostream` 类,用于将数据格式化为字符串。可以通过 `ostr...
    99+
    2023-08-25
    C++ iostringstream
  • C#中pingreply类怎么使用
    在C#中,PingReply类主要用于接收Ping操作的结果。可以通过以下步骤来使用PingReply类: 首先,创建一个Pin...
    99+
    2023-10-28
    C#
  • C#中的HttpWebRequest类怎么使用
    这篇文章将为大家详细讲解有关C#中的HttpWebRequest类怎么使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。HttpWebRequest 是一个Http 请求类,继承于 WebRequest。...
    99+
    2023-06-26
  • C#中的backgroundWorker类怎么使用
    BackgroundWorker类是C#中用于在后台执行操作的工具类。以下是使用BackgroundWorker类的常见步骤:1. ...
    99+
    2023-08-15
    C#
  • C++类怎么使用
    本篇内容介绍了“C++类怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!下面用实际的案例来说明C++类概念的问题,在世界中,经常有属于...
    99+
    2023-06-17
  • 怎么使用C++中的string类型
    这篇文章主要讲解了“怎么使用C++中的string类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么使用C++中的string类型”吧!1、string 类1.1 和char *的异同在...
    99+
    2023-06-25
  • C#中XML操作类怎么使用
    在C#中,可以使用System.Xml命名空间中的类来操作XML。下面是一个简单的示例,演示了如何创建XML文档、添加元素、保存和读...
    99+
    2023-10-22
    C# XML
  • C# MemoryStream类怎么使用
    MemoryStream类是在内存中读写二进制数据的流。可以通过以下步骤使用MemoryStream类:1. 创建一个MemoryS...
    99+
    2023-08-09
    C# MemoryStream
  • C++中类的this指针怎么使用
    这篇“C++中类的this指针怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中类的this指针怎么使用”文章吧...
    99+
    2023-06-29
  • C#中的枚举类型怎么使用
    在C#中,枚举类型用于定义一组命名的整数常量。以下是枚举类型的基本用法示例: // 定义一个枚举类型 public enum Day...
    99+
    2024-04-03
    C#
  • C++STL容器中string类怎么用
    这篇文章将为大家详细讲解有关C++STL容器中string类怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言为什么学习string类:在C语言中,字符串是以'\0'结尾的集合,为了...
    99+
    2023-06-29
  • C#类属性怎么使用
    本篇内容介绍了“C#类属性怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#类属性使用过RAD开发工具的一定inspector很熟悉...
    99+
    2023-06-17
  • c++的CImage类怎么使用
    CImage类是ATL/MFC库中的一个图像处理类,用于加载、保存和处理图像。以下是使用CImage类的基本步骤:1. 包含头文件在...
    99+
    2023-09-29
    c++
  • C++引用类型怎么使用
    这篇文章主要介绍“C++引用类型怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++引用类型怎么使用”文章能帮助大家解决问题。一、C++中的引用类型思考:如何在被调函数中修改主调函数中定义的...
    99+
    2023-07-02
  • 怎么用C语言制作表白神器
    今天小编给大家分享一下怎么用C语言制作表白神器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。程序说明这是一个表白神器,可以自...
    99+
    2023-07-05
  • Linux终端神器WindTerm怎么使用
    这篇文章主要介绍“Linux终端神器WindTerm怎么使用”,在日常操作中,相信很多人在Linux终端神器WindTerm怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2023-04-21
    linux
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作