C#BlockingCollection的TryTakeFromAny是否保证对BlockingCollection对象进行顺序检查?

时间:2014-10-20 18:15:52

标签: c# multithreading

我有两个阻止集合 - 一个比另一个更高优先级。如果我使用TryTakeFromAny并首先指定更高优先级的BlockingCollection,是否可以保证首先查看优先级较高的队列?

1 个答案:

答案 0 :(得分:5)

这没有记录,所以我想说不能保证它将来不会改变。可能不建议长期依赖它。但是,目前,BlockingCollection<T>.TryTakeFromAny通过对项目进行索引检查来循环遍历所有集合(它会检查Count&gt; 0然后执行TryTake)来快速检查。如果未找到任何项目,则会为每个集合获取内部等待句柄并将其传递给WaitHandle.WaitAny。这提供了保证:

  

当发出任何句柄信号时,此方法返回。如果在调用期间发出多个对象的信号,则返回值是具有所有信号对象的索引值最小的信号对象的数组索引。

因此,当前的实现确实会按要求运行。如果两个集合同时获得一个项目,则会获得较低的索引。