https://docs.microsoft.com/zh-cn/dotnet/standard/collections/thread-safe/blockingcollection-overview
BlockingCollection 概述
BlockingCollection<T> 是一个线程安全集合类,可提供以下功能:
-
实现制造者-使用者模式。
-
通过多线程并发添加和获取项。
-
可选最大容量。
-
集合为空或已满时通过插入和移除操作进行阻塞。
-
插入和移除“尝试”操作不发生阻塞,或在指定时间段内发生阻塞。
-
封装实现 IProducerConsumerCollection<T> 的任何集合类型
-
使用取消标记执行取消操作。
-
支持使用
foreach
(在 Visual Basic 中,使用For Each
)的两种枚举:-
只读枚举。
-
在枚举项时将项移除的枚举。
-
public class BlockingTest { BlockingCollection<int> bc = new BlockingCollection<int>(); public BlockingTest() { Task.Factory.StartNew(ProduceTask); // Task.Factory.StartNew(ConsumeTask); } private void ProduceTask() { foreach (var item in Enumerable.Range(1, 100)) { bc.Add(item); Console.WriteLine(string.Format("+++++++++++++: {0}", item) + " total:" + bc.Count); Thread.Sleep(100); } bc.CompleteAdding(); } private void ConsumeTask() { foreach (var item in bc.GetConsumingEnumerable()) { Console.WriteLine(string.Format("---------------: {0}", item)+" total:"+ bc.Count); } } }