假设我有两个队列,其中包含要发送到端点的相似消息类型。其中一个队列(队列A)具有最高优先级,因此必须始终首先发送它的消息。第二个队列(队列B)中的消息具有较低的优先级,应该仅在队列A为空时发送。我需要编写一些代码来包含这两个队列,并根据上面的逻辑发送它们的内容。我假设我应该用一个新的线程来做这件事,这样当队列被清空和我等待新消息到达时,系统就不会挂起。我想知道的是,有没有一个好的模式?我应该使用C#“Queue”类型吗?有什么不该做的建议吗?
发布于 2013-04-08 19:33:21
ConcurrentQueue Class提供了一个线程安全的队列实现。您可以将两个实例粘合在一起以形成您的优先级队列,并实现IProducerConsumerCollection Interface,以便可以将其包装在BlockingCollection 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;
...
}发布于 2013-04-08 19:43:19
为您的队列使用BlockingCollection,并使用ConcurrentPriorityQueue对其进行备份
您将创建ConcurrentPriorityQueue并将其传递给the BlockingCollection constructor that accepts an IProducerConsumerCollection
然后,无论生产者线程添加不同优先级的工作项的顺序是什么,消费者线程都会首先删除高优先级的项。
https://stackoverflow.com/questions/15877757
复制相似问题