首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BlockingCollection与GetConsumingEnumerable

BlockingCollection与GetConsumingEnumerable
EN

Stack Overflow用户
提问于 2014-05-08 03:23:33
回答 1查看 1.1K关注 0票数 1

我使用一个BlockingCollection来插入一些使用线程处理的值。

有时我必须对这个集合做一个“快照”来检查一些结果。所以我做了这样的事情:

代码语言:javascript
复制
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语句时,应用程序将冻结。

为什么?似乎反应被永远锁定了。

有什么想法吗?我做错了什么?

非常感谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-08 03:52:20

.GetConsumingEnumerable()生成集合获取其名称的“阻塞”枚举。简而言之,您使用的是错误的集合。

使用BlockingCollection的方法是在其上放置一个线程来运行一个循环。

代码语言:javascript
复制
foreach(var item in blockingCollection.GetConsumingEnumerable())
{
    //do some work
}

然后使用其他线程将对象放置到阻塞集合中。它被称为“阻塞集合”,因为它的枚举器在命中最后一个对象时会阻塞(休眠),然后等待直到一个新的项被添加到列表中。

每个循环的唯一出路是在阻塞集合上调用.CompleteAdding()。因为IEnumerable.Count()实际上只是..。

代码语言:javascript
复制
var count = 0;
foreach(var item in list)
{
   count++;
}
return count;

您的代码阻塞了if语句中的foreach循环(并等待您调用.CompleteAdding())。

我怀疑你真的想要更像ConcurrentBag的东西。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23532182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档