从 BlockingCollection 中删除项目

发布于 2024-11-01 09:33:53 字数 176 浏览 0 评论 0原文

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

myBlockingCollection.Remove(Item);

或者

myBlockingCollection.Take(Item);

How can an item be removed from a BlockingCollection? Which of the following is correct?

myBlockingCollection.Remove(Item);

or

myBlockingCollection.Take(Item);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

极致的悲 2024-11-08 09:33:53

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

Take() 方法从底层集合中删除一个项目并返回删除的项目。

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

删除的项目取决于 BlockingCollection 使用的底层集合 - 例如,ConcurrentStack 将具有 LIFO 行为,而 ConcurrentQueue; 将具有 FIFO 行为。

You can't specify a particular item to be removed from a BlockingCollection<T>.

The Take() method removes an item from the underlying collection and returns the removed item.

The TryTake(out T item) method removes an item from the underlying collection and assigns the removed item to the out parameter. The method returns true if an item could be removed; otherwise, false.

The item which is removed depends on the underlying collection used by the BlockingCollection<T> - For example, ConcurrentStack<T> will have LIFO behavior and ConcurrentQueue<T> will have FIFO behavior.

时光暖心i 2024-11-08 09:33:53

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

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

What about this code? - It's working but change the order of the collection. (And I didn't checked it in multi threads state).

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;
    }
っ〆星空下的拥抱 2024-11-08 09:33:53

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

I think only TryTake() is an option? I can't find documention on the Remove() method on MSDN.

没有伤那来痛 2024-11-08 09:33:53

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

I think TryTake(out item) will work. Remove does not exist in BlockingCollection class and Take does not take item as parameter.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文