假设我有两个队列持有类似的消息类型以发送到端点。其中一个队列(队列A)具有最高优先级,因此必须始终首先发送其消息。第二个队列(队列B)中的消息具有较低的优先级,并且只应在队列A为空时发送。我需要编写一些包含这两个队列的代码,并根据上述逻辑发送它们的内容。我假设我应该用一个新线程来做这个,这样当队列被清空时,系统不会挂起,而我正在等待新消息到达。我想知道的是,这有一个很好的模式吗?我应该使用C#“队列”类型吗?关于什么不该做的任何建议?
答案 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
然后,无论生产者线程添加不同工作项优先级的顺序,消费者线程都将首先删除高优先级项目。