Удаление элемента из коллекции BlockingCollection - PullRequest
3 голосов
/ 14 апреля 2011

Как можно удалить элемент из коллекции BlockingCollection?Что из следующего является правильным?

myBlockingCollection.Remove(Item);

или

myBlockingCollection.Take(Item);

Ответы [ 4 ]

8 голосов
/ 06 мая 2015

Вы не можете указать конкретный элемент, который будет удален из BlockingCollection<T>.

Метод Take() удаляет элемент из базовой коллекции и возвращает удаленный элемент.

Метод TryTake(out T item) удаляет элемент из базовой коллекции и назначает удаленный элемент параметру out. Метод возвращает true, если элемент может быть удален; иначе ложно.

Элемент, который удаляется, зависит от базовой коллекции, используемой BlockingCollection<T> - например, ConcurrentStack<T> будет иметь поведение LIFO, а ConcurrentQueue<T> будет работать FIFO.

4 голосов
/ 14 апреля 2011

Я думаю, что только TryTake () вариант?Я не могу найти документацию по методу Remove () на MSDN .

3 голосов
/ 06 марта 2012

А как насчет этого кода? - Это работает, но измените порядок сбора. (И я не проверял это в состоянии нескольких потоков).

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;
    }
1 голос
/ 14 апреля 2011

Я думаю TryTake(out item) будет работать.Remove не существует в классе BlockingCollection, а Take не принимает элемент в качестве параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...