从BlockingCollection中删除项目

时间:2011-04-14 08:05:26

标签: c# collections

如何从BlockingCollection中删除项目?以下哪项是正确的?

myBlockingCollection.Remove(Item);

myBlockingCollection.Take(Item);

4 个答案:

答案 0 :(得分:8)

您无法指定要从BlockingCollection<T>中删除的特定项目。

Take()方法从基础集合中删除项目并返回已删除的项目。

TryTake(out T item)方法从基础集合中删除项目,并将删除的项目分配给out参数。如果可以删除项,则该方法返回true;否则,错误。

删除的项目取决于BlockingCollection<T>使用的基础集合 - 例如,ConcurrentStack<T>将具有LIFO行为,ConcurrentQueue<T>将具有FIFO行为。

答案 1 :(得分:4)

我认为只有TryTake()是一个选项吗?我找不到MSDN上的Remove()方法的文档。

答案 2 :(得分:3)

这段代码怎么样? - 它正在工作,但改变了集合的顺序。 (我没有在多线程状态下检查它。)

public static bool Remove<T>(this BlockingCollection<T> self, T itemToRemove)
    {
        lock (self)
        {
            T comparedItem;
            var itemsList = new List<T>();
            do
            {
                var result = self.TryTake(out comparedItem);
                if (!result)
                    return false;
                if (!comparedItem.Equals(itemToRemove))
                {
                    itemsList.Add(comparedItem);
                }
            } while (!(comparedItem.Equals(itemToRemove)));
            Parallel.ForEach(itemsList, t => self.Add(t));
        }
        return true;
    }

答案 3 :(得分:1)

我认为TryTake(out item)会奏效。 BlockingCollection类中不存在Remove,Take不将item作为参数。