如何清空BlockingCollection

时间:2011-11-03 20:04:55

标签: c# .net c#-4.0 .net-4.0 task-parallel-library

我有一个帖子将项目添加到BlockingCollection

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

如果出现问题,我想突破我的foreach和我的方法并清除BlockingCollection中剩下的内容,但是我找不到办法。

有什么想法吗?

6 个答案:

答案 0 :(得分:16)

我正在使用此扩展方法:

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);
    }
}

我想知道是否有一个更好,更少hacky的解决方案。

答案 1 :(得分:6)

可能使用GetConsumingEnumerable的重载CancellationToken;那么,如果生产方出现任何问题,它可以取消消费者。

答案 2 :(得分:5)

这对我有用

while (bCollection.Count > 0)
{
    var obj = bCollection.Take();
    obj.Dispose();
}

Take()从集合中删除,您可以调用对象的任何清理,并且循环条件不会调用任何阻塞调用。

答案 3 :(得分:2)

取出所有剩余物品:

while (collection.TryTake(out _)){}

答案 4 :(得分:1)

BlockingCollection<T> yourBlockingCollection = new BlockingCollection<T>();

我认为你的意思是清除你的阻挡系列。乔恩的答案更适合我认为的实际问题。

答案 5 :(得分:-3)

只需清除收藏品即可:

myBlockingCollection.TakeWhile<*MyObject*>(qItem => qItem != null);

或只是

myBlockingCollection.TakeWhile<*MyObject*>(qItem => true);