C# BlockingCollection.takefrom是否有适合构建阻塞优先级队列的方法?

C# BlockingCollection.takefrom是否有适合构建阻塞优先级队列的方法?,c#,multithreading,.net-4.0,blockingcollection,C#,Multithreading,.net 4.0,Blockingcollection,我需要建立一个阻塞优先级队列,我的直觉是这可能是秘密因素,但是关于该方法的文档很少。其目的/适当用途是什么 我的要求是多个线程将添加到高优先级或低优先级队列中。一个线程将使用这两个队列,这两个队列总是在低优先级队列之前从高优先级队列获取 很可能BlockingCollection或takefromny方法对我都没有任何用处。如果是这样的话,那么一个指向正确方向的指针就很好了。你说得对。文件相当稀少。然而,我通过Reflector查看了实现,我相信您可以使用BlockingCollection.t

我需要建立一个阻塞优先级队列,我的直觉是这可能是秘密因素,但是关于该方法的文档很少。其目的/适当用途是什么

我的要求是多个线程将添加到高优先级或低优先级队列中。一个线程将使用这两个队列,这两个队列总是在低优先级队列之前从高优先级队列获取


很可能
BlockingCollection
takefromny
方法对我都没有任何用处。如果是这样的话,那么一个指向正确方向的指针就很好了。

你说得对。文件相当稀少。然而,我通过Reflector查看了实现,我相信您可以使用
BlockingCollection.take from任何
方法来模拟您想要的优先级偏差。原因是实现使用了
WaitHandle.WaitAny
方法,该方法返回所有信号对象的最小索引。这意味着,如果有两个或多个队列具有可用的项目,则始终会选择数组中首先出现的队列

以下代码应始终输出“高”

var low=newblockingcollection{“low”};
var high=新的BlockingCollection{“high”};
var array=newblockingcollection[]{high,low};
目标项目;
int index=BlockingCollection.TakeFromAny(数组,out项);
控制台写入线(项目);

感谢brian的及时回复。你的回答与我所观察到的一致。我现在担心的是,由于这种行为没有记录在案,我相信它不会从一个版本改变到下一个版本,我会冒多大的风险?@Ralph:我理解你的担心。我怀疑这正是微软所追求的行为,所以我的直觉是,它将永远以这种方式行事。如果能将这一关键信息添加到文档中以供确认,那一定很好,嗯?如果这是MS所追求的行为,它不是被称为
TakeFromFirstAvailable
吗?@Gabe--我想你是对的,TakeFromAny表明任何收藏都和另一个一样好,因此,我所依赖的行为可能在未来的版本中得到“修复”。想知道最好的办法是让MS澄清他们对这种方法的意图。@Gabe:说得好。我想您也可以为
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);