我需要构建一个阻塞priorty队列,我的预感是TakeFromAny可能是秘密成分,但是该方法的文档很少。它的目的/适当用途是什么/
我的要求是多个线程将添加到高优先级或低优先级队列。一个线程将消耗这两个队列,总是从低优先级队列之前的高优先级队列中获取。
很可能BlockingCollection或TakeFromAny方法对我没什么用处。如果是这样,那么正确的方向指针就会受到赞赏。
答案 0 :(得分:11)
你是对的。文档相当稀疏。但是,我通过Reflector查看了实现,我相信您可以使用BlockingCollection.TakeFromAny
方法来模拟您想要的优先级偏差。原因是因为实现使用WaitHandle.WaitAny
方法返回所有信号对象的最小索引。这意味着如果您有两个或更多可用项目的队列,那么将始终选择首先出现在数组中的队列。
以下代码应始终输出“high”。
var low = new BlockingCollection<object> { "low" };
var high = new BlockingCollection<object> { "high" };
var array = new BlockingCollection<object>[] { high, low };
object item;
int index = BlockingCollection<object>.TakeFromAny(array, out item);
Console.WriteLine(item);