【问题标题】:Concurrent collection with priority优先并发收集
【发布时间】:2014-05-05 10:26:17
【问题描述】:

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

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

我尝试使用旨在连接生产者和消费者的 BlockingCollection,但在我的任务中,我有两个并发消费者,而且 BlockingCollection 不具备插入项目以创建服务器优先列表的本机能力。

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

请帮我解决这个问题

谢谢

【问题讨论】:

  • 保持简单开始。将您的集合访问完全包装在另一个类中。不要不要让您的其余代码直接与集合交互。在您的包装类中,使用基本的lock 块来控制排序/添加/读取。编辑:阅读整个集合时,请随时lock 并创建集合的副本,以便在必要时返回给调用者。
  • 我正在以这种方式工作,但如果可能的话,我想听听其他方法。无论如何,谢谢。

标签: c# multithreading collections concurrency producer-consumer


【解决方案1】:

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

【讨论】:

  • 你有更多关于这个“偏好”的信息吗?如果它包含元素,它会总是从第一个队列中取出吗?
  • 不幸的是,这只能通过测试和浏览 .Net 源代码来支持。我找不到任何详细的文档...如果您发现任何相反的情况,如果您更新我,我将不胜感激。
【解决方案2】:

不幸的是,这不是内置的,您可能需要自己实现。为了帮助您入门,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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多