Как очистить коллекцию 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()
удаляет из коллекции, и вы можете вызвать любую очистку объекта, и условие цикла не вызывает никаких блокирующих вызовов.
BlockingCollection<T> yourBlockingCollection = new BlockingCollection<T>();
Я предположил, что вы имеете в виду очистить блокирующие коллекции. Ответ Джона более подходит к вашему фактическому вопросу, я думаю.
для очистки коллекции вы можете сделать:
myBlockingCollection.TakeWhile<*MyObject*>(qItem => qItem != null);
или просто
myBlockingCollection.TakeWhile<*MyObject*>(qItem => true);