什么是BlockingCollection.TakeFromAny方法有用

时间:2010-09-13 13:15:59

标签: multithreading .net-4.0

我需要构建一个阻塞pr​​iorty队列,我的预感是TakeFromAny可能是秘密成分,但是该方法的文档很少。它的目的/适当用途是什么/

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

很可能BlockingCollection或TakeFromAny方法对我没什么用处。如果是这样,那么正确的方向指针就会受到赞赏。

1 个答案:

答案 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);