bmt*_*033 5 .net algorithm queue producer-consumer
我有一个C#4.0应用程序,其中"高优先级"和"低优先级"队列实现如下:
BlockingCollection highPriority = new BlockingCollection(1000); BlockingCollection lowPriority = new BlockingCollection(1000);
在highPriority中生成的任何数据都应该在lowPriority中生成的任何数据之前消耗.这里的扭曲是可以随时向两个队列中的任何一个生成数据.因此,在我消耗了highPriority中的所有数据之后,我将使用可能位于lowPriority中的任何数据.如果在我使用lowPriority中的数据时在highPriority中生成新数据,我想完成使用lowPriority中的当前项,然后切换回并处理highPriority中的数据.
谁能建议一个算法来帮助解决这个问题?伪代码很好.非常感谢.
如果可以的话,您将希望将其包装到单个对象中,正如 @Kevin Brock 建议的那样,并让该对象实现IProducerConsumerCollection
. 否则,您调用的代码TryDequeue
将执行繁忙的等待循环。也就是说,对于两个队列,您必须编写如下内容:
WorkItem item = null;
do
{
if (!hpQueue.TryDequeue(out item))
{
lpQueue.TryDequeue(out item);
}
while (item != null);
Run Code Online (Sandbox Code Playgroud)
如果你使用自己的类,那么你可以使用事件(EventWaitHandle
等)来防止忙等待。
事实上,使用优先级队列可能会更好。使优先级队列成为线程安全并实现 是非常容易的IProducerConsumerCollection
,然后您可以将它与 一起使用BlockingCollection
。Julian Bucknall 的C# 优先级队列是一个不错的起点。