2014-05-08 2 views
1

Я использую BlockingCollection для вставки некоторых значений, которые обрабатываются с использованием некоторых потоков.BlockingCollection с GetConsumingEnumerable

Иногда я должен взять «снимок» этой коллекции, чтобы проверить некоторые результаты .. так что я сделать что-то вроде этого:

IEnumerable<SourceResult> response = m_response.GetConsumingEnumerable(); 
IEnumerable<string>  results = response.Where(i => i.source == "TEST1" || i.source == "TEST2").Select(i => i.json).DefaultIfEmpty(null); 

if (results != null && results.Count() > 0) 
{ 
    // CODE 
} 

Когда код достигает этого IF заявление, замерзает приложения.

Почему? Кажется, что ответ заблокирован навсегда.

Любые идеи? Что я делаю не так?

спасибо!

+0

Где именно вы используете тип BlockingCollection? –

+0

Наружные резьбовые петли @MarcelloGrechiLins =) – Crasher

ответ

2

.GetConsumingEnumerable() производит «блокировку», перечислимую, из которой коллекция получает свое название. Короче говоря, вы используете неправильную коллекцию.

Способ использования BlockingCollection заключается в том, чтобы поместить поток на него, чтобы запустить цикл.

foreach(var item in blockingCollection.GetConsumingEnumerable()) 
{ 
    //do some work 
} 

Затем, используя другие темы, вы помещаете объекты в блокирующую коллекцию. Он называется «блокировкой коллекции», потому что его перечислитель блокирует (спит), когда он ударяет по последним объектам, а затем ждет, пока новый элемент не будет добавлен в список.

Единственный выход из каждого цикла - вы вызываете .CompleteAdding() на блокирующую коллекцию. Поскольку IEnumerable.Count() действует только ...

var count = 0; 
foreach(var item in list) 
{ 
    count++; 
} 
return count; 

Ваш код блокировки на петле Еогеасп в, если заявление (и ждет, когда вы звоните .CompleteAdding()).

Я подозреваю, что вы НАСТОЯТЕЛЬНО хотели чего-то большего, как ConcurrentBag.

+0

Wow! Это очень помогло мне @Aron .. спасибо! На самом деле я сначала использовал ConcurrentBag, но я боялся, что не смог бы сделать цикл foreach, пока объекты Enqueuing =) – Crasher

Смежные вопросы