什么是BlockingCollection.TakeFromAny方法有用

Ral*_*ton 12 multithreading .net-4.0

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

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

很可能BlockingCollection或TakeFromAny方法对我没有任何用处.如果是这样,那么将理解正确方向上的指针.

Bri*_*eon 11

你是对的.文档相当稀疏.但是,我通过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);
Run Code Online (Sandbox Code Playgroud)

  • 如果那是 MS 所追求的行为,它会不会被称为“TakeFromFirstAvailable”? (2认同)