两个队列提供单个端点

时间:2013-04-08 11:20:43

标签: c# .net thread-safety fifo

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

2 个答案:

答案 0 :(得分: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;

    ...
}

答案 1 :(得分:1)

为您的队列使用BlockingCollection<T>,并使用ConcurrentPriorityQueue<T>

支持

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

然后,无论生产者线程添加不同工作项优先级的顺序,消费者线程都将首先删除高优先级项目。