如何清空BlockingCollection
本文关键字:BlockingCollection 清空 何清空 | 更新日期: 2023-09-27 18:13:18
我有一个线程向BlockingCollection
添加项目。
在我正在使用的另一个线程上foreach (var item in myCollection.GetConsumingEnumerable())
如果有问题,我想突破我的前臂和方法,清除BlockingCollection
中剩下的东西,但我找不到方法。
有什么想法吗?
只需取出所有剩余物品:
while (collection.TryTake(out _)){}
我使用这个扩展方法:
public static void Clear<T>(this BlockingCollection<T> blockingCollection)
{
if (blockingCollection == null)
{
throw new ArgumentNullException("blockingCollection");
}
while (blockingCollection.Count > 0)
{
T item;
blockingCollection.TryTake(out item);
}
}
我想知道是否有一个更好、不那么棘手的解决方案。
可能使用占用CancellationToken
的GetConsumingEnumerable
过载;然后,如果生产方出现任何问题,它可以取消消费者。
这对我有效
while (bCollection.Count > 0)
{
var obj = bCollection.Take();
obj.Dispose();
}
Take()
从集合中移除,您可以对对象调用任何清理,并且循环条件不会调用任何阻塞调用。
BlockingCollection<T> yourBlockingCollection = new BlockingCollection<T>();
我以为你的意思是清除你的阻塞收集。我认为乔恩的回答更适合你的实际问题。
只需清除集合即可:
myBlockingCollection.TakeWhile<*MyObject*>(qItem => qItem != null);
或者只是
myBlockingCollection.TakeWhile<*MyObject*>(qItem => true);