Как очистить коллекцию BlockingCollection

у меня есть поток, добавляющий элементы в BlockingCollection .

в другом потоке, который я использую foreach (var item in myCollection.GetConsumingEnumerable())

Если есть проблема, я хочу вырваться из моего foreach и моего метода и очистить все, что осталось в Я не могу найти способ сделать это.

какие идеи?

6 ответов


возможно использовать перегрузку GetConsumingEnumerable Что происходит CancellationToken, а затем, если что-то пойдет не так со стороны производителя, это может отменить потребителя.


Я использую этот метод расширения:

public static void Clear<T>(this BlockingCollection<T> blockingCollection)
{
    if (blockingCollection == null)
    {
        throw new ArgumentNullException("blockingCollection");
    }

    while (blockingCollection.Count > 0)
    {
        T item;
        blockingCollection.TryTake(out item);
    }
}

Мне интересно, есть ли лучшее, менее хакерское решение.


это сработало для меня

while (bCollection.Count > 0)
{
    var obj = bCollection.Take();
    obj.Dispose();
}

Take() удаляет из коллекции, и вы можете вызвать любую очистку объекта, и условие цикла не вызывает никаких блокирующих вызовов.


просто выньте все оставшиеся элементы:

while (collection.TryTake(out _)){}

BlockingCollection<T> yourBlockingCollection = new BlockingCollection<T>();

Я предположил, что вы имеете в виду очистить блокирующие коллекции. Ответ Джона более подходит к вашему фактическому вопросу, я думаю.


для очистки коллекции вы можете сделать:

myBlockingCollection.TakeWhile<*MyObject*>(qItem => qItem != null);

или просто

myBlockingCollection.TakeWhile<*MyObject*>(qItem => true);