0

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

4

2 回答 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 回答