问题标签 [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 回答
1480 浏览

c# - BlockingCollection.TakeFromAny 方法是否适合构建阻塞优先级队列?

我需要建立一个阻塞优先级队列,我的直觉是这TakeFromAny可能是秘密成分,但是关于该方法的文档很少。它的目的/适当的用途是什么?

我的要求是多个线程将添加到高优先级或低优先级队列中。一个线程将始终在低优先级队列之前从高优先级队列中消耗这两个队列。

很可能 theBlockingCollection或 the TakeFromAnymethod 都对我没有任何用处。如果是这样,那么正确方向的指针将不胜感激。

0 投票
1 回答
7262 浏览

c# - 带有 BlockingCollection.GetConsumableEnumerable 的 Parallel.ForEach 循环

为什么Parallel.ForEach循环OperationCancelledException在使用时退出GetConsumableEnumerable

0 投票
1 回答
2676 浏览

c# - 并发集合和唯一元素

我有一个并发BlockingCollection的重复元素。如何修改它以添加或获取不同的元素?

0 投票
5 回答
6341 浏览

c# - 使用 BlockingCollection: OperationCanceledException,有没有更好的办法?

我正在将(坦率地说很棒)BlockingCollection<T>类型用于高度多线程的高性能应用程序。

通过集合有很多吞吐量,并且在微观层面上它是高性能的。但是,对于每个“批次”,它总是通过标记取消令牌来结束。这会导致在任何等待Take调用时引发异常。这很好,但我会选择返回值或输出参数来发出信号,因为 a) 异常有明显的开销,b) 在调试时,我不想手动关闭特定的中断异常例外。

实现似乎很激烈,理论上我想我可以反汇编并重新创建我自己的不使用异常的版本,但也许有一种不太复杂的方法?

我可以null在集合中添加一个(或者如果不是,一个占位符)对象来表示进程应该结束,但是还需要一种很好地中止的方法,即唤醒等待线程并以某种方式告诉它们发生了什么事。

那么 - 替代集合类型?重新创建我自己的?有什么方法可以滥用这个?

(一些上下文:我选择了它,BlockingCollection<T>因为它比手动锁定 a 具有优势Queue。尽我所知,线程原语的使用非常棒,在我的情况下,这里和那里的几毫秒和最佳核心至关重要。 )

编辑:我刚刚为此开了一笔赏金。我不相信Anastasiosyal 的回答涵盖了我在评论中提出的问题。我知道这是一个棘手的问题。有人可以提供帮助吗?

0 投票
1 回答
405 浏览

c#-4.0 - 使用 BlockingCollection 时从消费者任务向生产者任务发送信号

我有一个非常基本的应用程序,它使用生产者任务和消费者任务来处理文件。它基于此处的示例http://msdn.microsoft.com/en-us/library/dd267312.aspx

该程序的基础是 Producer 任务枚举我硬盘上的文件并计算它们的哈希值并执行其他一些操作。一旦 Producer 处理完一个文件,它就会 Enques 文件,然后 Consumer 抓取它。

Consumer 任务必须连接到远程服务器并尝试上传文件。但是,如果消费者遇到错误,例如无法连接到远程服务器,我需要它向生产者任务发出信号,告知它应该停止正在做的事情并终止。如果服务器宕机或宕机,生产者无需继续循环浏览数千个文件。

我已经看到大量通过在 BlockingCollection 对象上使用 .CompleteAdding() 从 Producer 任务向 Consumer 任务发出信号的示例,但我不知道如何从 Consumer 向 Producer 发送信号,表明它应该停止生产。

0 投票
1 回答
940 浏览

c# - 流式数据 BlockingCollection

在斯蒂芬图布的书的第 88 页上

http://www.microsoft.com/download/en/details.aspx?id=19222

有代码

斯蒂芬然后提到

“将调用 GetConsumingEnumerable 的结果作为数据源传递给 Parallel.ForEach 时,循环使用的线程有可能在集合变空时阻塞。阻塞的线程可能不会被 Parallel.ForEach 释放回 ThreadPool “

我不明白为什么线程数会增加?

如果集合为空,那么blockingcollection 不会请求任何进一步的线程吗?

因此,您不需要使用 WithDegreeOfParallelism 来限制 BlockingCollection 上使用的线程数

0 投票
2 回答
9573 浏览

c# - 如何取消 BlockingCollection 上的 GetConsumingEnumerable()

在下面的代码中,我使用 CancellationToken 在生产者不生产时唤醒 GetConsumingEnumerable() 并且我想跳出 foreach 并退出任务。但我没有看到 IsCancellationRequested 被记录,并且我的 Task.Wait(timeOut) 等待完整的超时时间。我究竟做错了什么?

之后...

0 投票
2 回答
1292 浏览

c# - .Net 4.0 中的多个生产者/消费者交互

我正在使用 BlockingCollection 处理一些文件,然后将它们上传到服务器。

现在我有一个 Producer 递归文件系统并将某些文件压缩到临时位置。一旦它完成了一个文件,它就会将我自己的对象添加到 BlockingCollection 中,其中包含诸如文件名、文件路径、修改日期等信息。消费者然后抓住这个对象并使用它来上传文件。当 Producer 完成搜索文件系统并处理文件时,它调用 BlockingCollection.CompleteAdding() 方法向 Consumer 发出它已经完成的信号。

我想做的是将生产者的数量增加到2个或更多。原因是压缩过程需要一段时间,而且在多核处理器上我只利用 1 个核心。这会导致生产者有时在更快的网络上落后于消费者。

我的问题是,当我有多个生产者且只有一个消费者时,我如何向消费者发出所有生产者都已完成工作的信号?如果我在其中一个生产者上调用 BlockingCollection.CompleteAdding() 方法,我仍然可以让一个或多个其他生产者仍在工作。

0 投票
1 回答
5270 浏览

c# - 在 BlockingCollection 上调用 Dispose

我在 Albahari 的 Nutshell 书籍 ( http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT ) 中重用了 C# 中的示例生产者消费者队列,一位同事评论道:“为什么不调用 Dispose在集合的 Dispose 中的 BlockingCollection 上?”

我找不到答案,我能想到的唯一原因是队列的剩余工作负载的执行不会被处理。但是,当我处理队列时,为什么它不会停止处理?

除了“为什么不应该处理 BlockingCollection?” 我还有第二个问题“如果你不处理 BlockingCollection 会有害吗?”。我想当您生成/处理大量生产者消费者队列时,它会产生问题(不是我想要的,只是为了知道)。 根据BlockingCollection.Dispose 实际上做什么?BlockingCollection 包含两个等待句柄(显然),因此不调用 Dispose 会给您带来一些问题。感谢 ken2k 指出这一点。

我正在谈论的代码:

0 投票
1 回答
2344 浏览

c# - C# 4.0 中阻塞收集的性能

阻塞集合比普通队列堆积得更多。在以下场景中,

  1. 我有一个专门的线程作为消费者。

  2. 三个或更多专用线程作为生产者。

    我已经检查了正常队列(Monitor.Enter ...)以及阻塞收集。

结果:

正常队列在某些时候会自动清除,并且在 20000 或 30000 之后不会继续增加。但是阻塞收集继续增加超过数十万,显然我们没有明确的选择,同时我不想限制生产者

任何人都可以阐明一些光..