我使用一个BlockingCollection来插入一些使用线程处理的值。
有时我必须对这个集合做一个“快照”来检查一些结果。所以我做了这样的事情:
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语句时,应用程序将冻结。
为什么?似乎反应被永远锁定了。
有什么想法吗?我做错了什么?
非常感谢!
发布于 2014-05-08 03:52:20
.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;您的代码阻塞了if语句中的foreach循环(并等待您调用.CompleteAdding())。
我怀疑你真的想要更像ConcurrentBag的东西。
https://stackoverflow.com/questions/23532182
复制相似问题