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

c# - Producer/Consumer,BlockingCollection,等待变化

我正试图解决 BlockingCollection 和我的生产者/消费者问题。

我想要实现的目标如下:

  • 一种线程安全队列,以 FIFO 方式保存对象列表(“作业”)。
  • 第二个线程安全队列,也以 FIFO 方式保存这些作业的结果列表。

换句话说:

到目前为止,我卑微的尝试是:

我选择 BlockingCollection 的原因之一是因为我想将负载保持在最低限度,这意味着只有当项目实际上在集合内时才工作(而不处理等待/睡眠)。我不确定 foreach 是否是正确的方法。

请让我知道这是否正确或是否有更好的方法。谢谢!

编辑 我可以从单元测试中看出,任务中的工作实际上是同步的。新版本如下:

非常感谢输入!

0 投票
0 回答
515 浏览

asp.net - ASP.NET:部署后,我自己的 ThreadPool 线程没有被终止,CPU 被 100% 使用

我有一个在 IIS 7、.NET 4 上运行的 ASP.NET 应用程序,它偶尔需要与另一个 Web 服务通信(触发并忘记样式通知)。到目前为止,我曾经Thread为每个我发现非常无效的通知触发一个(由于创建新线程的成本很高)。

出于这个原因,我开始使用BlockingCollection<>容器来跟踪需要处理的通知,并Application_Start使用此代码启动 3 个消费者来处理此队列:

其中 sessionBuilder 只是一个提供数据库会话的对象。

消费者看起来像这样:

虽然这似乎工作正常,但只要我将新版本的应用程序部署到 IIS,服务器的 CPU 就开始被我的w3wp进程使用 99%。这绝对是我使用 BlockingQueue 带来的,在改变之前它并没有这样。

为了弄清楚 CPU 时间到底花在哪里,我让WMemoryProfiler和 WinDbg 随时查看所有托管线程的堆栈跟踪的捕获。

通过这种方式,我发现在我的进程 100% 使用 CPU 的那一刻,我有 17 个消费者线程正在运行,它们都将时间花在以下方面:

所以,很明显,我在这里有一个问题。消费者不会在 AppDomain 卸载时终止(在部署后第一个 HTTP 请求到达时立即发生)。


1) 为什么消费者没有被终止?我以为那AppDomainUnloadException是为了。

2)我是否应该有一些全局取消令牌,我会发出信号(但什么时候?)并让当前消费者知道他们的时间已经结束?或者这里推荐的模式是什么?

3) 17 个线程在上面显示的调用堆栈中花费时间充分利用 CPU 是否正常?或者,更确切地说,调用Take()可以BlockingCollection<>同时将这么多线程置于这种情况下是否正常?

0 投票
1 回答
3814 浏览

c# - GetConsumingEnumerable() Producer-Consumer 的多线程 BlockingCollection 替代方案

我有一个情况,我有多个生产者和多个消费者。生产者将作业输入队列。我选择了 BlockingCollection,它的效果很好,因为我需要消费者等待找到工作。但是,如果我使用 GetConsumingEnumerable() 功能,集合中项目的顺序会发生变化......这不是我需要的。

它甚至在 MSDN http://msdn.microsoft.com/en-us/library/dd287186.aspx 中说它不保留项目的顺序。

有谁知道这种情况的替代方案?

我看到 Take 方法可用,但它是否也为消费者线程提供了“等待”条件?

它说http://msdn.microsoft.com/en-us/library/dd287085.aspx

“对 Take 的调用可能会阻塞,直到可以删除某个项目。” 使用 TryTake 会更好吗?我真的需要线程等待并继续检查工作。

0 投票
1 回答
1699 浏览

c# - 多线程多个生产者和消费者线程不会同步 BlockingCollection 竞争条件

我有多个生产者和多个消费者。我的共享资源是 BlockingCollection。但是,我的代码只有在我有一个消费者时才有效。我知道这是一种竞争条件,因为每次运行代码时输出都不同。

我认为 BlockingCollection 会处理所有同步等,但事实并非如此。

那么如何在所有生产者和消费者之间同步我的共享资源呢?

这是我的代码:

0 投票
1 回答
233 浏览

c# - C# 结构和指针

我需要使用阻塞集合,以便可以异步调用委托。不幸的是,委托有两个参数,由一个结构和一个附加字符串组成。使用该结构是因为它是通过 Interop 调用外部 c 函数的结果。
现在我正在寻找一种在使用阻塞集合时避免复制结构的方法。
目前我的代码如下所示:

消费者然后解包 StructTransfer。

StructTransfer 目前看起来像这样

有没有一种简单的方法可以使用指针来避免构造函数中的复制语句,以便我可以轻松地使用阻塞集合?

0 投票
1 回答
209 浏览

.net - 带有缓冲区和缓存的并发收集

我正在寻找一个类似于 BlockingCollection 的集合对象,它可以让我拥有多个消费者。但是,我需要那些多个消费者来消费所有的物品。他们不能从中删除项目。本质上,我需要能够从另一个线程向其中添加项目,并希望任何获得 Enumerator 的人都能滚动浏览所有添加的项目。并阻止直到它关闭。

哪里有这样的集合类型?

[编辑] 天哪,我想我会澄清一下... BlockingCollection.GetConsumingEnumerable() 在项目不可用或调用 CompleteAdding 之前返回阻止枚举的枚举。我想要同样的东西,除了不从集合中删除项目。

[编辑] 好的。任何。我解决了这个问题:通过编写我自己的阻止列表。

0 投票
1 回答
2433 浏览

c# - 如何使用 C# 任务并行库和 IProducerConsumerCollection 实现通用回调?

我有一个向基于 Web 的 API 提交请求的组件,但必须限制这些请求,以免违反 API 的数据限制。这意味着所有请求都必须通过一个队列来控制它们提交的速率,但它们可以(并且应该)并发执行以实现最大吞吐量。每个请求必须在将来某个时间点完成时将一些数据返回给调用代码。

我正在努力创建一个很好的模型来处理数据的返回。

使用 aBlockingCollection我不能只Task<TResult>Schedule方法中返回 a,因为入队和出队过程位于缓冲区的两端。因此,我创建了一个RequestItem<TResult>包含表单回调的类型Action<Task<TResult>>

这个想法是,一旦从队列中拉出一个项目,就可以使用已启动的任务调用回调,但是到那时我已经丢失了泛型类型参数,我只能使用反射和各种讨厌的东西(如果它是甚至可能)。

例如:

Task<TResult>当请求从缓冲区中拉出并提交给 API 时,如何继续缓冲我的请求但向客户端返回一个?

0 投票
2 回答
989 浏览

c# - c# wpf 使用 Dispatcher 从 BlockingCollection 更新 UI 源

这是我的问题。
我在 BlockingCollection 中加载了一些 BitmapImages

加载发生在背景工作线程中。

调试这部分代码一切正常,现在问题来了...

完成加载图像后,我想在 UI 中一张一张地显示它们。我正在使用调度程序来执行此操作,但我总是收到消息,告诉我被调用的线程无法访问该对象,因为它属于不同的线程。

debug 指责错误在这里

我正在尝试一切,但无法找出问题所在。有人有什么想法吗?

0 投票
1 回答
1803 浏览

c# - BlockingCollection vs Subject 用作​​消费者

我正在尝试在 C# 中实现消费者。有许多发布者可以同时执行。我创建了三个示例,一个使用 Rx 和主题,一个使用 BlockingCollection,第三个使用来自 BlockingCollection 的 ToObservable。在这个简单的示例中,他们都做同样的事情,我希望他们与多个制作人一起工作。

每种方法的不同之处是什么?

我已经在使用 Rx,所以我更喜欢这种方法。但我担心 OnNext 没有线程安全保证,而且我不知道 Subject 和默认调度程序的排队语义是什么。

有线程安全的主题吗?

是否要处理所有消息?

当这不起作用时,还有其他情况吗?是否同时处理?

不是 Rx,但很容易适应使用/订阅它。它需要一个项目,然后处理它。这应该连续发生。

使用有点像主题的阻塞集合似乎是一个很好的折衷方案。我隐含地猜测会安排任务,这样我就可以使用异步/等待,对吗?

0 投票
0 回答
576 浏览

c# - 如何与多个消费者进行阻塞收集

我正在尝试使用 BlockingCollection 实现一个生产者和多个消费者。创造了这样的代码

但任何时候我添加一个元素只有 1 个任务会消耗该值,所有其他的都缺少它。如何模拟多个消费者。

我不能使用 Rx 或 TPL 库。

谢谢