假设我有两个队列,其中包含要发送到端点的相似消息类型。其中一个队列(队列 A)具有最高优先级,因此必须始终首先发送其消息。第二个队列(队列 B)中的消息具有较低的优先级,只能在队列 A 为空时发送。我需要编写一些包含这两个队列的代码,并根据上述逻辑发送它们的内容。我假设我应该使用一个新线程来执行此操作,以便在清空队列以及等待新消息到达时系统不会挂起。我想知道,这有什么好的模式吗?我应该使用 C#“队列”类型吗?关于不做什么的任何建议?
问问题
90 次
2 回答
1
ConcurrentQueue<T> 类提供队列的线程安全实现。您可以将两个实例粘合在一起以形成您的优先级队列并实现IProducerConsumerCollection<T> 接口,以便将其包装在BlockingCollection<T> 类中。然后任何线程都可以将项目添加到队列中,并且一个线程使用GetConsumingEnumerable 方法消耗这些项目。
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;
...
}
于 2013-04-08T11:33:21.257 回答
1
将 aBlockingCollection<T>
用于您的队列,并用 a 支持它ConcurrentPriorityQueue<T>
您将创建您的ConcurrentPriorityQueue
并将其传递给BlockingCollection
接受IProducerConsumerCollection
那么无论生产者线程以何种顺序添加不同优先级的工作项,消费者线程都会先移除高优先级的项目。
于 2013-04-08T11:43:19.227 回答