问题标签 [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.
c# - foreach 是否从 C# BlockingCollection 中删除?
有谁知道,在 C# BlockingCollection<> 上进行迭代时,是否从集合中获取元素,就像 BlockingCollection.Take() 一样?
谢谢
编辑:当然我的意思是 BlockingCollection,但出于某种原因,我想到了 BlockingQueue 并使用了它。
c# - 等到后台线程清除 BlockingCollection 队列,如果时间过长则超时?
在 C# 中,我想知道是否可以等到 BlockingCollection 被后台线程清除,如果时间过长则超时。
我目前拥有的临时代码让我觉得有些不雅(从什么时候开始使用Thread.Sleep
?):
.net - 如何修复 BlockingCollection / ConcurrentQueue 消耗延迟?
在启用了超线程的 Windows7 四核上,我有一百个线程通过BlockingCollection<T>
(全部使用默认构造函数初始化,因此在ConcurrentQueue<T>
内部使用)进行通信。
所有线程每秒都会收到 10-100 条消息,除了每天只收到 4-20 条消息的线程。
我的问题与最后一个消费者有关:大多数时候,它被阻止等待新消息,但是当一条消息准备好被消费时,它应该尽快处理,可能是立即处理。
问题是,当一条消息被添加到BlockingCollection
该消费者的专用消息时,它会在几秒钟后被接收(Take() 在消息入队后的 3 到 12 秒内返回)。
我猜这个问题与windows如何安排这个线程有关。
我试图在没有任何改进的情况下增加这个消费者的 ThreadPriority。然后我尝试将其处理器亲和性设置为专用内核,并且我已更改所有其他线程的亲和性以使用其他内核,但仍然没有任何改进。
我该如何解决这个问题?实际问题是什么?
这是线程循环(commands
是BlockingCollection
):
当没有消息待处理时,我是否应该直接使用ConcurrentQueue
, 睡眠 50 毫秒(这是可以接受的延迟)?
请注意,
没有 CPU 使用超过 50%。
至于延迟:日志显示(大多数情况下)在“已调度:...”和“等待命令”之间经过了几秒钟。(又名 on commands.IsCompleted
)和“等待命令”之间的其他一些。和“收到:...”(又名 on commands.Take()
)
所有“正常”的线程都是 I/O 绑定的,但它们是合作的:相信我,我无法改变它们的设计。但是它们工作得很好:唯一的错误行为是执行不同类型工作的低负载线程。我知道线程优先级是邪恶的,但我没有找到更好的解决方案。
(几乎)复制问题
的测试 这是在服务器上几乎复制问题的测试。“几乎”是因为测试对 CPU 施加压力(全部达到 100%),而在实际应用中所有 CPU 都低于 50%:
有任何想法吗?
c# - 阻塞集合使用 TPL DataFlow 进行批处理
有没有办法从阻塞集合中批量处理项目集合。例如
我有一个消息总线发布者调用blockingCollection.Add()
还有一个像这样创建的消费线程:
但是,我只希望控制台在阻塞集合上有 10 个项目后写入,而 GetConsumingEnumerable() 总是在添加每个项目后触发。我可以为此编写自己的队列,但如果可能的话我想使用阻塞集合?
c# - 线程和定时器的奇怪行为
我说明我的情况。
我有一个生产者 1 对 N 消费者模式。我正在使用阻塞集合,一切都运行良好。做一些测试我注意到这种奇怪的行为:
我正在测试我对数据的操作在我的消费者中花费了多长时间。我注意到了这个奇怪的事情,在下面你会发现我的操作清除了代码并产生了奇怪的行为。
我有 1 个生产者的 4 个消费者。对于大多数数据,控制台不打印任何内容,因为 ts=0(它在一个刻度下)但随机(每 1 到 5 秒之间)它会绘制类似这样的东西(不是按这个非常特定的顺序,而是同一种):
它大约是 10,000 个滴答声,因此大约需要 1 毫秒。总是格式为 (N)000(N-1) 的数字 请注意,我使用的 BlockingCollection 是根据完全随机发生的一些网络事件填充的。从这里没有什么规律的。
时机几乎是完美的,总是 10,000 滴答声的倍数。
这背后可能是什么?谢谢!
c# - Blocking collection - Remove a specific element
I'm using a blocking collection as I need this list to be thread safe:
I'm trying to remove a specific order, lets say I want to remove order.ID 1
if it was a normal collection would be something like
I've read about those collections there is Take()
and TryTake()
but none of them allows me to specify which one I want to remove.
c# - 网站异步发布到 Loggly
我正在尝试研究如何为应用程序日志记录到 Loggly 制作异步日志记录解决方案。查看Loggly 的文档,并将其视为经典的 Producer-Consumer 问题,我想出了这个:
用于 JSON 数据序列化的消息模型:
记录器类,它将被传递给任何需要记录的东西(比如ExceptionFilter
)。这使用 aBlockingCollection
来排队发送到 Loggly 的消息。
以下是我的问题:
- 这种设置模式有问题
BlockingCollection
吗? - JSON.Net 会找出正确的子类
LogMessage
,还是我需要以不同的方式发送消息? - 吞咽异常绝对是一种代码异味,但我不确定如果记录器无法发送消息会发生什么。有什么想法吗?
在此先感谢,所以。
vb.net - VB.NET 中的基本 BlockingCollection 生产者消费者
在过去的几个小时里,我一直在努力让 BlockingCollection 的基本实现工作。我似乎一辈子都找不到 VB.NET 教程,所以一直在尝试从 C# 教程中获得一些有用的东西。
我只是想让一个基本的实现工作,这样我就可以继续做我真正需要的事情。但我被困住了。
这是我目前的代码:
运行此程序我没有得到任何输出,只有以下例外:
mscorlib.dll 中出现“System.FormatException”类型的第一次机会异常 Microsoft.VisualBasic.dll 中出现“System.FormatException”类型的第一次机会异常 Microsoft.VisualBasic 中出现“System.InvalidCastException”类型的第一次机会异常.dll
在过去的几个小时里,我一直在谷歌上搜索,试图解决这个问题,但无济于事。希望这里有人可以提供帮助。
谢谢
c# - 如何添加自定义消息泵支持参数?
这与这个问题有关: 如何创建自定义消息泵?
我基本上需要相同的消息泵,除了它还需要能够支持输入参数。上述问题的答案仅支持不接受参数的 Action() 委托。我希望能够将参数传递给我的操作。这是无参数版本:
这样做的正确方法是什么?我正在考虑让 BlockingCollection 存储一个自定义类而不是 Action,假设称为 ActionWithParameter,它看起来如下所示:
但它看起来很笨重,而且在获取动作时我还需要一些 switch 语句来确定参数是什么类型,以便能够调用动作(参数)。另外,如果我想支持多个参数怎么办?那我应该用object[] parameters
吗?肯定有更好的解决方案吗?
c# - 在 c# 中使用阻塞集合进行数据库访问和下载图像
我正在开发一个表单上有两个按钮的程序。第一个执行访问数据库的功能,而其他从数据库下载图像并将其与 3 个图像副本(缩略图、缩放、小)一起保存。
访问数据库的代码
访问数据库后,下一个任务是下载图像,生成它的三个副本并将所有内容保存在一个文件夹中。为此,我正在尝试使用BlockingConnection<>
. 生产者部分执行下载原始图像并保存的功能,而消费者部分执行访问生产者队列以获取图像然后生成副本的功能。
实现 BlockingCollection 的代码
让我告诉你,当我用 BackgroundWorker 测试这段代码时,它运行得非常好。我收到错误的部分是尝试将图像保存在 Task1 中的行。
它抛出了这个异常
我想通了为什么它不保存图像。我已经相应地更改了代码。但它没有正确循环。在获得一个图像并生成其多个副本后,它应该返回第一个 foreach,下载新图像并生成其副本。