0

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

我最初的做法是创建两个额外的线程:首先更新服务器列表,第二次从每个服务器验证的响应时间和排序根据它们的响应时间服务器的列表。

我试图使用BlockingCollection,它被设计为连接生产者和消费者,但在我的任务中,我有两个并发使用者,并且BlockingCollection也没有本地能力插入项目以创建服务器的优先级列表。

ConcurrentStack或ConcurrentQueue也不能按原样使用,因为它们像BlockingCollection一样是非阻塞的,它们需要额外的机制来阻塞需要来自队列的线程的线程。

请帮我解决这个任务

感谢

+0

保持简单开始。完全将您的收藏夹与另一个类包装在一起。不要允许其他代码直接与集合进行交互。在包装类中,使用基本的'lock'块来控制排序/添加/读取。编辑:当阅读整个集合,随时锁定和创建集合的_copy_返回给调用者,如果有必要。 –

+0

我正以这种方式工作,但如果可能的话,我想倾听替代方法。无论如何,谢谢。 –

回答

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

1

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

+0

您是否还有关于“偏好”的更多信息?如果它包含元素,它会总是从第一个队列中取出吗? – Cocowalla

+0

不幸的是,这只能通过测试和浏览.Net源代码来支持。我无法找到任何详细的文档...如果您发现任何违规行为,我将不胜感激。 – OSH