我需要建立一个阻塞优先级队列,我的直觉是这TakeFromAny
可能是秘密成分,但是关于该方法的文档很少。它的目的/适当的用途是什么?
我的要求是多个线程将添加到高优先级或低优先级队列中。一个线程将始终在低优先级队列之前从高优先级队列中消耗这两个队列。
很可能 theBlockingCollection
或 the TakeFromAny
method 都对我没有任何用处。如果是这样,那么正确方向的指针将不胜感激。
我需要建立一个阻塞优先级队列,我的直觉是这TakeFromAny
可能是秘密成分,但是关于该方法的文档很少。它的目的/适当的用途是什么?
我的要求是多个线程将添加到高优先级或低优先级队列中。一个线程将始终在低优先级队列之前从高优先级队列中消耗这两个队列。
很可能 theBlockingCollection
或 the TakeFromAny
method 都对我没有任何用处。如果是这样,那么正确方向的指针将不胜感激。
你说的对。文档相当稀疏。但是,我通过 Reflector 查看了实现,我相信您可以使用该BlockingCollection.TakeFromAny
方法来模拟您想要的优先级偏差。原因是因为实现使用WaitHandle.WaitAny
返回所有信号对象的最小索引的方法。这意味着,如果您有两个或更多包含可用项目的队列,则始终会选择出现在数组中的第一个队列。
以下代码应始终输出“高”。
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);