我想出了一些代码来消耗队列中所有等待的项目。与其一个接一个地处理项目,不如将所有等待的项目作为一个集合来处理。我已经这样声明了我的队列。privateBlockingCollectionitems=newBlockingCollection(newConcurrentQueue);然后,在消费者线程上,我计划像这样批量读取项目,ItemnextItem;while(this.items.TryTake(outnextItem,-1)){varworkToDo=newList();workToDo.Add(nextItem);while(this.items.TryTake(outnex
我在Albahari(http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT)的Nutshell书中重用了C#中的示例生产者消费者队列,一位同事评论道:“为什么不在集合的Dispose中对BlockingCollection调用Dispose?”我找不到答案,我能想到的唯一原因是队列剩余工作负载的执行不会被处理。但是,当我处理队列时,为什么它不会停止处理?除了“为什么你不应该处理BlockingCollection?”我还有第二个问题“如果不处理BlockingCollection会有害吗?”。我想当你产生/处
我使用的是生产者-消费者模式,我使用的是BlockingCollection来生成数据并使用其中的数据。我调用一个方法来生成数据,然后将BlockingCollection设置为CompleteAdding,以便使用者使用BlockingCollection中的所有数据。经过一些处理后,应用程序想要将一些其他数据添加到BlockingCollection,但它不能,因为它被设置为CompleteAdding,我该如何设置CompleteAdding为false,或者我如何使用BlockingCollection中的所有数据,而不是等待ComleteAdding?
我需要一个不允许重复的并发集合(在BlockingCollection中用作生产者/消费者)。我不需要严格的元素顺序。另一方面,我想尽量减少集合中元素“存活”的最长时间。IE。收集不能是LIFO,理想情况下它应该是FIFO。好吧,我会说我需要不允许重复的ConcurrentQueue,但是不允许重复的ConcurrentBag也可以。为什么C#不包含类似的东西,而可能有人已经创建了它?这个问题是我之前问题的结果WhattypeofIProducerConsumerCollectiontouseformytask? 最佳答案 没有内置
我最近一直在使用ReactiveFramework做一些工作,到目前为止我非常喜欢它。我正在考虑用一些过滤的IObservables替换传统的轮询消息队列来清理我的服务器操作。在过去,我处理进入服务器的消息是这样的://StartspinningtheprocessmessageloopTask.Factory.StartNew(()=>{while(true){Commandcommand=m_CommandQueue.Take();ProcessMessage(command);}},TaskCreationOptions.LongRunning);这导致连续轮询线程将来自客户端的
调用BlockingCollection.Take()时,集合的IsCompleted状态可能会在检查IsCompleted和调用Take()之间发生变化。MSDNDocumentation显示的示例只是捕获无效操作异常,但似乎必须有一种正确的方法来执行此类调用而不捕获异常(因为这会产生相当大的开销并且在代码中看起来不干净)。调用.Take()并避免无效操作异常的正确方法是什么?我的特定问题的简化版本:If(!blockingCollection.IsCompleted){//dosomestuffvalue=blockingCollection.Take();//ThrowsExce
我有一个这样的取消标记staticCancellationTokenSourceTokenSource=newCancellationTokenSource();我有一个像这样的阻塞集合BlockingCollectionitems=newBlockingCollection();varitem=items.Take(TokenSource.Token);if(TokenSource.CancelPending)return;当我打电话TokenSource.Cancel();Take没有像它应该的那样继续。如果我将TryTake与民意调查一起使用,token会显示它被设置为已取消。
我有一个线程将项目添加到BlockingCollection。在我正在使用的另一个线程上foreach(myCollection.GetConsumingEnumerable()中的var项目)如果出现问题,我想跳出我的foreach和我的方法并清除BlockingCollection中剩余的任何内容,但是我找不到解决方法。有什么想法吗? 最佳答案 我正在使用这个扩展方法:publicstaticvoidClear(thisBlockingCollectionblockingCollection){if(blockingCollec
我正在使用.NET4.0BlockingCollection来处理一个项目队列,每个项目都需要通过一个操作来处理,而这个操作最多可能需要一秒钟来处理每个项目。这个项目队列可以由不同的线程添加。我有几个关于这个的问题a)允许多个消费者处理这个BlockingCollection?我注意到GetConsumingEnumerable(),似乎适用于单一消费者场景。拥有多个消费者的原因是,通过命名管道实例的处理一次最多可以处理其中三个项目,因此我认为我可以拥有三个消费者。b)有没有办法检查某个项目是否在此队列中,如果是,让调用者检查是否有要阻塞的项目,直到该项目被处理?编辑:根据JonS
我有一个使用任务并行库的可量化和可重复的问题,BlockingCollection,ConcurrentQueue&GetConsumingEnumerable在尝试创建一个简单的管道时。简而言之,将条目添加到默认BlockingCollection(在引擎盖下依赖于ConcurrentQueue)来自一个线程,不保证它们会从BlockingCollection中弹出。来自另一个调用GetConsumingEnumerable()的线程方法。我创建了一个非常简单的Winforms应用程序来重现/模拟它,它只将整数打印到屏幕上。Timer1负责排队工作项......它使用一个名为_tra