问题标签 [blockingcollection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1035 浏览

c# - 在消息循环中使用 Rx 而不是 BlockingCollection

我有一个简单的消息传递框架,它围绕附加到多个“客户端”实例的“主机”的单个实例构建。每个实例通过向其推送消息来与另一个实例通信。然后,实例使用单独的任务按照接收消息的顺序处理它们自己的消息。

这是代码的简化版本:

我的要求是每个处理它们的消息的实例都使用并行执行(如果可能的话),并且每条消息都按照每个班级一次收到一条的顺序进行处理。

生成仅从 GetConsumingEnumerable() 中提取的新任务是不是一个坏主意?

我觉得我可以使用响应式扩展和 IObserveable 来简化这一点,但我对使用 Rx 还是很陌生,并且不确定如何构建它来满足我的并行执行需求。

任何指导将不胜感激!

0 投票
2 回答
988 浏览

c# - BlockingCollection 未按预期执行

我有一个调用Func后台线程传递的方法,称为TaskSpin. DataGridView这会根据在(DGV)中单击的站点一次执行一种方法,并且一次只能执行一种方法。所以我点击一个站点(DGV 中的一个纽扣电池),然后它在该站点上运行该方法。现在我有很多站点,不想点击等待数百次,而是想批量处理 DGV 中包含的所有站点。我不能使用直接循环来运行这些,即

因为这几乎会立即返回给调用者,并将开始运行以下站点,这并不好,因为他们使用共享文件。所以我需要一种方法来将站点排队以逐个执行。我决定使用 a ConncurrentCollection - BlockingCollection,但我被卡住了。在某些按钮单击事件中,我有

其中AsyncMethod使用 TPL 在后台线程上启动了一个 set 方法。

我的期望是这将一个Action<object[]>接一个地运行。但这只是冻结了我的申请。我在这里做错了什么?

谢谢你的时间。

*编辑。任务旋转*

0 投票
4 回答
927 浏览

c# - 无法创建 BlockingCollection 数组

我有以下代码:

我得到以下错误的底线:

无法使用 [] 将索引应用于“System.Collection.Concurrent.BlockingCollection”类型的表达式

即使我这样做:

最后一个方括号出现错误:

语法错误;期望值

我正在尝试BlockingCollection使用的集合制作一个数组,ConcurrentQueue以便我可以做到:

我做错了什么,我能做些什么来解决它?我可以不创建一个数组,BlockingCollection我必须列出它吗?

0 投票
1 回答
2769 浏览

c# - 将集合添加到 BlockingCollection

BlockingCollection 仅包含添加单个项目的方法。如果我想添加一个集合怎么办?我应该只使用“foreach”循环吗?

为什么 BlockingCollection 不包含添加集合的方法?我认为这种方法非常有用。

0 投票
2 回答
2874 浏览

.net-4.0 - foreach 是使用 BlockingCollection 的唯一方法吗在 C# 中?

我现在开始与 TPL 合作。我在这个视频中看到了一个使用 TPL 的简单版本的生产者/消费者模型。

这是问题所在:

以下代码:

返回IEnumerable<Double>可以使用 foreach 迭代(并自动使用)的:

我的问题是:

  1. 如果我得到IEnumerator<Double> dEnum = d.GetEnumerator()from (例如,用循环d迭代)也会消耗列表吗?(我的回答:我不这么认为,因为 the 与没有联系,如果你明白我的意思的话。所以它会消耗,但不会,甚至不会)dwhiled.MoveNext()dEnumddEnumdbc
  2. 我可以以循环以外的方式循环bc(或) ,消耗物品吗?(循环比循环快得多,我担心科学计算问题的性能问题)dforeachwhileforeach
  3. 在类型中究竟消耗BlockingCollection<T>是什么意思?

例如,代码:

谢谢大家!

0 投票
1 回答
2581 浏览

.net - .Net Concurrent BlockingCollection 有内存泄漏?

我正在使用带有> 的生产者/消费者模式System.Collection.Concurrent.BlockingCollection<DataTable从数据库(生产者)中检索数据并在数据(消费者)上创建一个 Lucene 索引。

Producer 一次抓取 10000 条记录并将集合添加到BlockingCollection<DataTable>. 消费者(稍微慢一点)然后抓取这 10000 个并创建一个索引。

阻塞集合限制为<DataTable>10000 行中的 5 行。

起初,该程序运行良好,但在它获得大约 150000 行后,我注意到我的计算机内存已用完并且速度变慢。

似乎 BlockingCollectionnull在获取项目后无法将基础数组槽设置为。

代码:

任何人都可以确认拒绝此暂停吗?有什么解决办法吗?

0 投票
1 回答
582 浏览

c# - 如何使用 BlockingCollection 数组,一次一个元素,在 C# 中?

我已经看到很多关于如何BlockingCollection<T>在生产者-消费者场景中使用 a 的示例,甚至是如何在此处一次使用一个元素。我对并行编程很陌生,所以我面临以下问题:

实际上,问题在于如何编写ConsumerProducerExample.ConsumerMethod下面示例中的方法,以便它为数组中的每个元素消耗前 2doubleBlockingCollection<Double>,然后为数组中的每个元素消耗下一个 2 double,依此类推。

我已经在下面的示例中编写了该方法,但这不是我希望它工作的方式。这是我在上面链接的示例中所知道的。恰恰相反:就像这里一样,它会double在跳转到BlockingCollection<Double>数组的下一个之前消耗掉每个。而且,我希望它只消耗两个double,然后跳转到下一个BlockingCollection<Double>,消耗两个double,等等。完成数组循环后,它应该再次double为每个BlockingCollection<Double>元素消耗下两个,依此类推。

它们应该像这样使用:

有什么建议么?

简而言之,这是一种尝试同时计算nEl微分方程解中的峰值(sin(x)在本例中,解由 表示)。

0 投票
1 回答
3106 浏览

c# - 有界 BlockingCollections 在添加期间会丢失数据吗

我有一个 BlockingCollection(ConcurrentBag, 50000),我试图为生产者线程使用 50,000 的非常小的有界容量,以最大限度地增加我可以在消费者线程的 ConcurrentDictionary 中处理的记录数。生产者比消费者快得多,否则会消耗大部分内存。

不幸的是,我立即注意到我的 ConcurrentDictionary 中的记录总数现在大大低于在我的测试数据执行时添加 50,000 的有界容量后应有的记录数。我读到 BlockingCollection 的 .add 方法应该无限期地阻塞,直到集合中有空间可以执行添加。然而,情况似乎并非如此。

问题:

  1. 如果在 BlockingCollection 中的容量释放之前调用了太多 add 方法,BlockingCollection 的 .add 方法最终会超时还是静默失败?

  2. 如果 #1 的答案是肯定的,那么在超出 Bounding Capacity 后我可以尝试多少次添加而不丢失数据?

  3. 如果调用了许多 BlockingCollection .add() 方法,这些方法正在等待/阻塞容量并调用 CompleteAdding() 方法,那么那些等待/阻塞的添加会继续等待然后最终添加还是静默失败?

0 投票
2 回答
1492 浏览

c# - BlockingCollection 多个消费者

我有以下代码,其中包含一个生产者线程和多个消费者线程。你知道多个消费者是否是线程安全的。例如,线程 1 是否有可能正在消耗,而线程 2 是否并行消耗并更改线程 1 中使用的项目的值?

提前致谢

0 投票
2 回答
1764 浏览

c# - 使用 BlockingCollection 更新 ObservableCollection

我订阅了一项服务,该服务将在收到新元素时引发事件,我将此元素添加到BlockingCollection.
我有第二个线程正在运行,它将循环BlockingCollection添加/更新可观察集合中的元素。

问题是如何添加ObservableCollection?我知道我不能只.add对这种类型的集合做一个,因为它需要在 UI 线程上完成。所以我尝试使用不同ObservableCollection的子类,这些子类使用调度程序来编组元素的添加,但每一次,我都会遇到同样的错误

“未知模块中发生了‘System.StackOverflowException’类型的未处理异常。”

故障排除提示如下:

确保您没有无限循环或无限递归。

好吧,实际上我确实有某种无限循环,因为它一直在BlockingQueue接收新元素,比如每秒 5 到 10 个。
如果我不将控件绑定到observablecollection,或者如果我使用 List 代替,我不会得到异常。

编辑当我追踪它时,该错误自行消失了。我试图让事情变得更简单,以便真正了解问题所在,然后它开始起作用。当把东西重新组合在一起时,它仍然可以工作......但它会不时地回来,因为似乎不相关的原因,比如在我的列表视图中添加样式。我开始认为第三方 dll 存在问题。