【问题标题】:Two queues feeding a single endpoint两个队列为单个端点提供数据
【发布时间】:2013-04-08 11:20:43
【问题描述】:

假设我有两个队列,其中包含要发送到端点的相似消息类型。其中一个队列(队列 A)具有最高优先级,因此必须始终首先发送其消息。第二个队列(队列 B)中的消息具有较低的优先级,只能在队列 A 为空时发送。我需要编写一些包含这两个队列的代码,并根据上述逻辑发送它们的内容。我假设我应该使用一个新线程来执行此操作,以便在清空队列以及等待新消息到达时系统不会挂起。我想知道,这有什么好的模式吗?我应该使用 C#“队列”类型吗?有什么不该做的建议吗?

【问题讨论】:

  • 为什么不使用具有优先级的单个队列,这里有一些建议:stackoverflow.com/questions/4016509/…
  • 所有这些实现问题在很大程度上取决于您的技术堆栈。即 Web、桌面、WCF?

标签: c# .net thread-safety fifo


【解决方案1】:

ConcurrentQueue<T> Class 提供队列的线程安全实现。您可以将两个实例粘合在一起以形成您的优先级队列并实现IProducerConsumerCollection<T> Interface,因此它可以包装在BlockingCollection<T> Class 中。然后任何线程都可以将项目添加到队列中,并且一个线程使用GetConsumingEnumerable Method 消费这些项目。

enum Priority
{
    Low,
    High,
}
struct Prioritized<T>
{
    public Priority Priority;
    public T Item;
}
class PriorityQueue<T> : IProducerConsumerCollection<Prioritized<T>>
{
    private readonly ConcurrentQueue<T> low;
    private readonly ConcurrentQueue<T> high;

    ...
}

【讨论】:

  • 当你看一个 0 和 1 的屏幕时,你看到矩阵了吗?
【解决方案2】:

为您的队列使用BlockingCollection&lt;T&gt;,并使用ConcurrentPriorityQueue&lt;T&gt; 支持它

您将创建您的 ConcurrentPriorityQueue 并将其传递给 the BlockingCollection constructor that accepts an IProducerConsumerCollection

那么无论生产者线程以何种顺序添加不同优先级的工作项,消费者线程都会先移除高优先级的项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 2015-10-06
    • 2017-07-30
    相关资源
    最近更新 更多