C# 需要同时使用ConcurrentQueue和ConcurrentDictionary

C# 需要同时使用ConcurrentQueue和ConcurrentDictionary,c#,concurrency,C#,Concurrency,我有一个要求,即可以将消息并行添加到ConcurrentQueue。我有一个线程,可以频繁地读取消息并记录它们。我不想在这个时间间隔内多次重复记录相同的消息,而是想在Z时间内将其记录为消息X重复Y次。我想保持消息出现的顺序。为了保持计数,我使用了ConcurrentDictionary我尝试了几种方法,但由于额外的锁,计数变得有点复杂。我可以在不需要任何额外锁的情况下满足我的要求。避免锁通常会增加复杂性,以换取更好的性能。@CodesInChaos是的,但我希望看到一些解决方案,即使复杂性不好。

我有一个要求,即可以将消息并行添加到
ConcurrentQueue
。我有一个线程,可以频繁地读取消息并记录它们。我不想在这个时间间隔内多次重复记录相同的消息,而是想在Z时间内将其记录为消息X重复Y次。我想保持消息出现的顺序。为了保持计数,我使用了
ConcurrentDictionary
我尝试了几种方法,但由于额外的锁,计数变得有点复杂。我可以在不需要任何额外锁的情况下满足我的要求。

避免锁通常会增加复杂性,以换取更好的性能。@CodesInChaos是的,但我希望看到一些解决方案,即使复杂性不好。假设我的队列在任何时候都没有太多不同的消息。如果要对集合的访问进行
锁定
,则使用
并发
命名空间版本没有任何意义,只需使用传统版本即可。不确定为什么您会认为使用
很复杂,您会在一个方法周围抛出一个
,该方法将一个项添加到这两个项中,或者从这两个项中提取一个项。它与非并发版本相同,但没有
。试图在不使用
锁的情况下对其进行管理要困难得多,而且可能需要您从头开始编写自定义集合。@Servy我想,如果我有比使用单个锁按顺序执行每个排队和出列操作更好的解决方案的话。从理论上讲,您是这样做的,但这将是一项巨大的工作,并且将非常复杂且容易出错,并且只有在存在大量锁争用的情况下才会产生有意义的差异,即使如此,性能差异也不会那么大。除非这是一个性能非常关键的应用程序,并且您已经证明,如果没有基本的
,您将无法生存,否则您应该尝试使用基本的