Ral*_*ton 12 multithreading .net-4.0
我需要构建一个阻塞priorty队列,我的预感是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)