优先并发收集

时间:2014-05-05 10:26:18

标签: c# multithreading collections concurrency producer-consumer

我有许多线程从服务器列表中检索数据。服务器列表每5分钟从服务器解析器下载一次。我处理数据的线程应该只使用响应时间最短的服务器。每个服务器的响应时间可能与请求的请求明显不同。因此,在更新服务器列表之间的时间范围内,我应该验证每个服务器的响应时间。

我最初的方法是创建两个额外的线程:第一个更新服务器列表,第二个来验证每个服务器的响应时间,并根据服务器的响应时间对服务器列表进行排序。

我尝试使用专门用于连接生产者和消费者的BlockingCollection,但在我的任务中,我有两个并发消费者,并且BlockingCollection还没有本机能力来插入用于创建优先服务器列表的项目。

ConcurrentStack或ConcurrentQueue也不能按原样使用,因为它们像BlockingCollection一样是非阻塞的,并且它们需要其他机制来阻止需要队列中项目的线程。

请帮我解决这个任务

由于

2 个答案:

答案 0 :(得分:1)

考虑使用两个或更多BlockingCollection并使用TakeFromAny来收听所有队列。该方法(虽然我没有在文档中提到它)更喜欢从它正在侦听的队列数组中的第一个队列中获取元素。

答案 1 :(得分:0)

不幸的是,这不是内置的,您可能需要实现自己的。为了帮助您入门,msdn示例中已经实现了这一功能,可以与BlockingCollection一起使用。

http://blogs.msdn.com/pfxteam/archive/2010/04/04/9990342.aspx

为了有效实现,您需要将其基于堆数据结构。这是一篇很好的文章虽然该类没有实现IProducerConsumerCollection:

http://www.codeproject.com/Articles/126751/Priority-queue-in-C-with-the-help-of-heap-data-str