【发布时间】:2014-05-05 10:26:17
【问题描述】:
我有许多线程从服务器列表中检索数据。每 5 分钟从服务器解析器下载服务器列表。我处理数据的线程应该只使用响应时间最短的服务器。每个服务器的响应时间可能因请求而异。因此,在更新服务器列表之间的时间范围内,我应该验证每个服务器的响应时间。
我最初的方法是创建两个额外的线程:第一个更新服务器列表,第二个验证每个服务器的响应时间并根据它们的响应时间对服务器列表进行排序。
我尝试使用旨在连接生产者和消费者的 BlockingCollection,但在我的任务中,我有两个并发消费者,而且 BlockingCollection 不具备插入项目以创建服务器优先列表的本机能力。
ConcurrentStack 或 ConcurrentQueue 也不能按原样使用,因为它们像 BlockingCollection 一样是非阻塞的,并且它们需要额外的阻塞线程机制,这些机制需要队列中的项目。
请帮我解决这个问题
谢谢
【问题讨论】:
-
保持简单开始。将您的集合访问完全包装在另一个类中。不要不要让您的其余代码直接与集合交互。在您的包装类中,使用基本的
lock块来控制排序/添加/读取。编辑:阅读整个集合时,请随时lock并创建集合的副本,以便在必要时返回给调用者。 -
我正在以这种方式工作,但如果可能的话,我想听听其他方法。无论如何,谢谢。
标签: c# multithreading collections concurrency producer-consumer