【C#】BlockingCollection 用法浅析
共 1102字,需浏览 3分钟
·
2022-04-09 15:42
多线程操作集合时,ConcurrentQueue
是我常用的,一直用得也挺爽,突然发现了 BlockingCollection
,原来还可以更简单。。。
BlockingCollection
是一个自带阻塞功能的线程安全集合类,和 ConcurrentQueue
有点像,不同的是,BlockingCollection
自带阻塞功能。
Add
方法用于向集合添加元素。Take
方法用于从集合中获取元素。当集合为空时,Take
方法将阻塞,直到获取到新元素。CompleteAdding
方法标记集合为完成状态,此后不能再向集合中添加元素,调用Add
将抛出System.InvalidOperationException
异常。调用
CompleteAdding
方法将使阻塞状态的Take
方法抛出System.InvalidOperationException
异常。实例化
BlockingCollection
时,可以传入boundedCapacity
参数,设置集合的上限,集合中元素到达上限后,Add
方法将阻塞。TryAdd
方法在集合满时,不会阻塞,而是直接返回false
,并且丢弃要插入的元素。TryTake
方法在集合为空时不会阻塞,而是会返回false
。当有多个线程
Take
时,将形成一个 Take 队列,依次获取到元素。
这是 MSDN 上的 例子:
https://docs.microsoft.com/zh-cn/dotnet/standard/collections/thread-safe/blockingcollection-overview
BlockingCollection dataItems = new BlockingCollection(100);
Task.Run(() =>
{
while (!dataItems.IsCompleted)
{
Data data = null;
try
{
data = dataItems.Take();
}
catch (InvalidOperationException) { }
if (data != null)
{
Process(data);
}
}
Console.WriteLine("\r\nNo more items to take.");
});