问题标签 [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 投票
2 回答
912 浏览

c# - 多线程 BlockingCollection 相同的值

我在访问相同 BlockingCollection 的 C# 应用程序中使用两个线程。这很好用,但我想两次检索第一个值,以便两个线程检索相同的值 *。

几秒钟后,我想轮询两个线程的 currentIndex 并删除每个 value < index. 例如,线程的最低 currentIndex 为 5,应用程序删除队列中索引 0 -5 处的项目。另一种解决方案是如果所有线程都处理了该值,则删除队列中的值。

我怎样才能做到这一点?我想我需要另一种类型的缓冲区..?

先感谢您!

*如果thread1调用了.Take(),则该item在collection中被移除,thread2无法再次获取相同的item。


更新:

我想将数据存储在缓冲区中,例如 thread1 将数据保存到 HDD,thread2 分析(相同)数据(并发)。

0 投票
1 回答
392 浏览

c# - 为什么Backgroundeworker + BlockingCollection 组合比较慢?

我有一个程序访问数据库和下载图像。我就是BlockingCollection为了这个目的使用的。但是,为了访问一些 UI 元素,我决定使用Backgroundworker和的组合BlockingCollection。与仅使用时的速度相比,它大大降低了处理速度Blockingcollection。可能是什么原因?或者当我现在访问 UI 元素时,速度会降低?

这是我正在处理的代码:

如下Do_Work()

0 投票
1 回答
434 浏览

c# - 将项目添加到 BlockingCollection

Orginnally 我有一个 BlockingCollection

我向其中添加了项目。

现在发现每个ChannelResource都有对应的字符串,所以想把ChannelResource对象和字符串一起添加到BlockingCollection中。

如何?合并对象ChannelResource和字符串形成匿名类型?

编辑:

我的意思是我必须将 BlockingCollection 重新定义为

和 T 包含ChannelResourcestring在一起?

0 投票
1 回答
367 浏览

.net - 如何在基于 ConcurrentStack 的 BlockingCollection 上 TryPeek

我有一个BlockingCollection基于ConcurrentStack

Dim stackBase As New ConcurrentStack(Of MyObject) Dim myStack = New BlockingCollection(Of MyObject)(stackBase)

在我的一个生产者中,我想在添加新项目之前检查阻塞集合中的顶部项目。我了解在此期间该商品可能会被消费者移除。在这种情况下,这不是问题,因为我只是想避免掩埋某些物体。

ConcurrentStackhasTryPeek可以完美运行,但我无权访问该对象stackBase

有任何想法吗?

0 投票
1 回答
783 浏览

c# - 使用 BlockingCollection 时的死锁和 TPL 数据流在一起

我已经编写了一个示例测试来复制该问题。这不是我的实际代码,我试图写一个小复制。如果将边界容量增加到迭代次数,有效地使其没有边界,则不会死锁,如果将最大并行度设置为像 1 这样的小数,则不会死锁。

同样,我知道下面的代码不是很好,但我实际发现的代码要大得多且难以理解。基本上有一个与远程资源的连接的阻塞对象池,并且流中的几个块使用了该连接。

关于如何解决这个问题的任何想法?乍一看,这似乎是数据流的问题。当我停下来查看线程时,我看到许多线程在 Add 时被阻塞,0 个线程在 take 时被阻塞。addBlocks 出站队列中有几个项目尚未传播到 takeblock,因此它被卡住或死锁。

0 投票
0 回答
600 浏览

c# - 如何在没有竞争条件和异常的情况下检测 BlockingCollection 的添加完成?

我正在使用一个BlockingCollection{T}仅由一个线程填充并仅由一个线程消耗的线程。生产和消费物品工作正常。问题出在此操作结束时。任务阻塞(如预期)在GetConsumingEnumerable。调用CompleteAdding任务后将处理BlockingCollection并完成,没有任何异常。到目前为止,一切都很好。

现在我有一个线程可以将项目添加到BlockingCollection. 该线程必须进行测试IsAddingCompleted,然后必须添加该项目。IsAddingCompleted但是在请求和添加项目之间存在竞争条件。有一个TryAdd- 方法,但如果添加已经完成,也会引发异常。

如何在没有附加锁的情况下添加已完成的项目或测试?为什么会TryAdd抛出任何异常?false如果添加已经完成,返回就可以了。

非常简化的代码如下所示:

是的,我知道这段代码没有意义,因为几乎没有机会添加任何项目并且 foreach-loop 没有注意到。消费任务对我的问题无关紧要。

问题显示在ConsumeItem-method 中。我可以添加一个额外的锁(信号量)arroundConsumeItemCompleteAdding+Dispose但我尽量避免这种性能影响。

如何在没有任何例外的情况下添加项目?如果添加已完成,丢失物品会很好。

0 投票
2 回答
525 浏览

c# - 如何处理来自匿名任务的异常?

我有一种方法可以从服务器中分块提取数据并将其返回以进行处理。我做了一些测量,发现在后台下载块并通过BlockingCollection<T>. 这允许客户端和服务器同时工作,而不是相互等待。

调用者(一个 C++/CLI 库)应该知道发生了异常,以便它可以重试或酌情退出。在最小限度地更改返回类型的同时将异常传播给调用者的最佳方法是什么?

0 投票
1 回答
1434 浏览

c# - 将多个参数传递给一个任务

我希望将两个BlockingCollection<>s 传递给任务。我试图将它们放在一个对象数组中并传递它们,但它不起作用。谁能帮我这个?我试图传递值的代码写在下面:

0 投票
1 回答
1367 浏览

c# - 使用 BlockingCollection 的消费者/生产者看起来很慢

我通过下面的“生产者”从外部套接字连接获取数据。

我将数据放入 aBlockingCollection中,然后由消费者读取。如果消费者在固定期限内没有收到数据,它无论如何都会触发,这样 my ProcessDataOnGrid, 就会在数据到达时或至少在 x 毫秒后执行某些操作。

问题是我已经读过这BlockingCollection是首选的方法,但是看起来很慢。

从获取外部数据到调用ProcessDataOnGrid. 我是否使用不正确,还是有更好的方法来等待数据但仅在固定的时间段内?

制片人:

消费者:

0 投票
1 回答
1188 浏览

c# - BlockingCollection.TryTake(object,TimeSpan) 是否应该立即返回新数据?

我试图确定为什么我的阻塞集合的性能看起来很慢。下面的问题进一步说明了我的代码的简单版本。

我的问题是 BlockingCollection.TryTake(object,TimeSpan) 是否立即返回新数据?

从我的测试看来,数据不会立即返回。这似乎是理想的行为还是我使用不正确?

上一个问题的代码细节:

使用 BlockingCollection 的消费者/生产者看起来很慢