从BlockingCollection中删除项目

Sta*_*ker 3 c# collections

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

myBlockingCollection.Remove(Item);
Run Code Online (Sandbox Code Playgroud)

要么

myBlockingCollection.Take(Item);
Run Code Online (Sandbox Code Playgroud)

Der*_*k W 8

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

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

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

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


小智 5

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

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;
    }
Run Code Online (Sandbox Code Playgroud)


Val*_*ale -1

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