繁体   English   中英

从BlockingCollection中删除项目

[英]Removing an item from a BlockingCollection

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

myBlockingCollection.Remove(Item);

要么

myBlockingCollection.Take(Item);

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM