- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在几年前编写的应用程序中有一个有界阻塞队列。我们只是说实现不是很好,但它是有效的。但是,它有一些性能问题。它看起来像 .NET 4.0 BlockingCollection<T>
是正确的替换,但我需要确保它实际上是一个队列。也就是说,如果以单一生产者、单一消费者的方式使用,是否可以保证严格的 FIFO?
文档没有具体说。 BlockingCollection主题确实说(在备注中):
BlockingCollection<T>
is similar to a traditional blocking queue data structure, except that the underlying data storage mechanism is abstracted away as anIProducerConsumerCollection<T>
.
但没有明确说明内容将按照添加的顺序删除。
有人知道吗?
最佳答案
嗯,BlockingCollection<T>
确实是为并行工作而设计的,您同时拥有多个“生产者”和一个消费者(使用 GetConsumingEnumerable())。
在这种情况下,您无法保证插入顺序,因此未指定顺序约束。
也就是说,BlockingCollection<T>
适用于任何 IProducerConsumerCollection<T>
(在构造函数中指定)。如果您不在构造函数中提供一个,在内部,它将使用 ConcurrentQueue<T>
.这导致它成为 FIFO,因为它实际上(在内部)是一个队列。所以是的,默认情况下,至少在当前的实现中,它将“如果以单一生产者、单一消费者的方式使用,则保证是严格的 FIFO”。如果你想强制这个用于 future 的验证(因为队列是一个实现细节),只需将它构造为:
var blockingCollection = new BlockingCollection<MyClass>(new ConcurrentQueue<MyClass>());
这将保证它现在和将来都使用队列(因为队列是一个实现细节)。
关于c# - BlockingCollection<T> 是否保证移除顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3825275/
我有两个阻塞集合 - 一个优先级高于另一个。如果我使用 TryTakeFromAny 并首先指定更高优先级的 BlockingCollection,是否可以保证首先查看更高优先级的队列? 最佳答案 这
我有一个使用 BlockingCollection<> 实现的下载队列.现在我想偶尔优先考虑一些下载。我认为将某些元素“向上”移动到集合中可能会很棒,例如在列表中,但没有像 Remove()/AddF
BlockingCollection.Dispose实际上做什么? 最佳答案 这样可以正确处理内部等待 handle 。 BlockingCollection在内部使用一对事件等待句柄,它们又具有关联
BlockingCollection blockingCollection = new BlockingCollection(); // create and start a producer
将来自多个线程的消息放到一个队列中并让一个单独的线程一次处理一个队列中的项目的最佳方法是什么? 在尝试断开多个线程的事件时,我经常使用这种模式。 我正在为此使用 BlockingCollection,
我正在尝试正确建模多线程单生产者/多消费者场景,其中消费者可以要求生产者获取元素,但生产者需要执行耗时的操作来生产它(想想执行查询或打印文档)。 我的目标是确保没有消费者可以同时要求生产者生产一件商品
我知道使用 ConcurrentQueue 的 BlockingCollection 的 boundedcapacity 为 100。 但是我不确定那是什么意思。 我正在尝试实现一个并发缓存,如果队列
BlockingCollection 仅包含添加单个项目的方法。如果我想添加一个集合怎么办?我应该只使用 foreach 循环吗? 为什么 BlockingCollection 不包含添加集合的方法?
我正在编写一个 WCF 服务,它从多个模块(数据库、其他服务..)接收通知并将它们添加到阻塞集合中,以便在将相关数据发布到客户端的使用者线程上进行处理。 客户端可以请求存储在服务器上的完整数据,在此操
我有这样一种情况,我需要有大量(数百个)队列,其中的项目应该按顺序处理(需要单线程消费者)。我的第一个实现,based on the samples,我为每个 BlockingCollection 使
Stephen Toub 的书第 88 页 http://www.microsoft.com/download/en/details.aspx?id=19222 有代码 private Blockin
我即将使用如下所示的 BlockingCollection,只是想检查它是否适合线程安全等。想知道我是否需要 CancellationTokenSource。 谢谢 public class MyAp
你好,我正在尝试创建一个使用流数据的应用程序......(所以没有结束......完成......等) 由于它的性质,因为流数据得到了很多操作,我使用 BlockingCollection,它工作得很
我有一个 BlockingCollection .生产者任务向其中添加项目,消费者任务移除项目。 现在我想限制集合中的项目数量,如果添加了更多项目,则自动丢弃旧数据。该集合不应同时包含超过 N 个最近
我有一个线程将项目添加到 BlockingCollection 。 在我正在使用的另一个线程上foreach(myCollection.GetConsumingEnumerable() 中的 var
我有一个程序如下 class Program { public static int TaskCount { get; set; } public stati
我有以下代码,其中包含一个生产者线程和多个消费者线程。你知道多个消费者是否是线程安全的。例如,线程 1 是否有可能正在消费,而线程 2 是否并行消费并更改线程 1 中使用的项目的值? namespac
我需要建立一个阻塞优先级队列,我的预感是 TakeFromAny 可能是 secret 成分,但是关于该方法的文档很少。它的目的/适当用途是什么? 我的要求是多个线程将添加到高优先级或低优先级队列中。
有没有办法删除 具体 BlockingCollection 中的项目,如下所示: IMyItem mySpecificItem = controller.getTopRequestedItem();
我试图在.NET 4上新的Parallel Stacks的背景下理解BlockingCollection的目的。 MSDN文档说: BlockingCollection用作IProducerConsu
我是一名优秀的程序员,十分优秀!