【问题标题】:Is the BlockingCollection.TakeFromAny method suitable for building a blocking priority queue?BlockingCollection.TakeFromAny 方法是否适合构建阻塞优先级队列?
【发布时间】:2010-09-13 13:15:59
【问题描述】:

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

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

很可能BlockingCollectionTakeFromAny 方法对我都没有任何用处。如果是这样,那么正确方向的指针将不胜感激。

【问题讨论】:

    标签: c# multithreading .net-4.0 blockingcollection


    【解决方案1】:

    你是对的。文档相当稀疏。但是,我通过 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);
    

    【讨论】:

    • 感谢布赖恩非常及时的回复。您的回答与我观察到的一致。我现在担心的是,由于这种行为没有记录在案,如果我相信它不会从一个版本更改为下一个版本,我会冒多大的风险?
    • @Ralph:我理解你的担忧。我怀疑这是 Microsoft 所追求的确切行为,所以我的 预感 是它总是会以这种方式运行。将关键信息添加到文档中以进行确认肯定会很好,嗯?
    • 如果那是 MS 所追求的行为,它不会被称为 TakeFromFirstAvailable 吗?
    • @Gabe --- 我认为你是对的,TakeFromAny 建议任何集合都与另一个集合一样好,因此我所依赖的行为可能会在未来版本中“修复”。想知道让 MS 澄清他们对这种方法的意图的最佳方法是什么。
    • @Gabe:好点。我想您也可以为 WaitHandle.WaitAny 方法提出类似的论点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多