如何清空BlockingCollection

本文关键字:BlockingCollection 清空 何清空 | 更新日期: 2023-09-27 18:13:18

我有一个线程向BlockingCollection添加项目。

在我正在使用的另一个线程上foreach (var item in myCollection.GetConsumingEnumerable())

如果有问题,我想突破我的前臂和方法,清除BlockingCollection中剩下的东西,但我找不到方法。

有什么想法吗?

如何清空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);
    }
}

我想知道是否有一个更好、不那么棘手的解决方案。

可能使用占用CancellationTokenGetConsumingEnumerable过载;然后,如果生产方出现任何问题,它可以取消消费者。

这对我有效

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);
相关文章:
  • 没有找到相关文章