C# BlockingCollection花费了太多的时间来唤醒

C# BlockingCollection花费了太多的时间来唤醒,c#,multithreading,producer-consumer,blockingcollection,C#,Multithreading,Producer Consumer,Blockingcollection,当BlockingCollection从.Take()调用中醒来花费太多时间时,我遇到了一个问题 情况是这样的: 我有一个线程可以非常快地将数据推送到BlockingCollection(实际上在XUnit中,我为做了一个循环。我有一个3任务,它只是坐在.Take()调用中,等待添加项。从输出中,我可以看到将近200项(最多1秒或更长)在第一个任务唤醒并实际从BlockingCollection收集数据之前,已添加到收集中 我有多个基于BlockingCollection的“缓冲区”,以管道方式

BlockingCollection
.Take()
调用中醒来花费太多时间时,我遇到了一个问题

情况是这样的: 我有一个线程可以非常快地将数据推送到
BlockingCollection
(实际上在XUnit中,我为
做了一个
循环。我有一个3
任务
,它只是坐在
.Take()
调用中,等待添加项。从输出中,我可以看到将近200项(最多1秒或更长)在第一个
任务
唤醒并实际从
BlockingCollection
收集数据之前,已添加到收集中

我有多个基于
BlockingCollection
的“缓冲区”,以管道方式组织,所有这些缓冲区都会在
上花费太多时间醒来。采取()

我尝试了
.TryTake()
.getconsumineGenumerable()
,结果相同

在这个管道的末尾,我有一个单线程的、速度慢的函数,可以一个接一个地处理项目,处理单个项目可能需要未知的时间。我只需要确保“项目”从“缓冲区”到“缓冲区”的传递非常快(一旦它被插入第一个“缓冲区”)


我只需要确保启动时间(在
.Take()
.TryTake()
等中)将在项目添加到集合的时间附近发生

发布完整的可执行重新编程代码。我怀疑您不能并且会在过程中发现错误。@Jasper我的观点是您没有明显的错误。有必要查看代码以找到错误。我想您的问题来自线程争用和上下文切换。在这种情况下,线程可能不是正确的解决方案。基于任务的异步可能是更好的方法。或者,由于您有一个要立即作出反应的数据序列,为什么不考虑使用.NET(Rx)的反应式扩展。?@Jasper我不确定这是否有帮助,但我今天刚刚推了这个。。。