我有两个阻止集合 - 一个比另一个更高优先级。如果我使用TryTakeFromAny并首先指定更高优先级的BlockingCollection,是否可以保证首先查看优先级较高的队列?
答案 0 :(得分:5)
这没有记录,所以我想说不能保证它将来不会改变。可能不建议长期依赖它。但是,目前,BlockingCollection<T>.TryTakeFromAny
通过对项目进行索引检查来循环遍历所有集合(它会检查Count&gt; 0然后执行TryTake
)来快速检查。如果未找到任何项目,则会为每个集合获取内部等待句柄并将其传递给WaitHandle.WaitAny
。这提供了保证:
当发出任何句柄信号时,此方法返回。如果在调用期间发出多个对象的信号,则返回值是具有所有信号对象的索引值最小的信号对象的数组索引。
因此,当前的实现确实会按要求运行。如果两个集合同时获得一个项目,则会获得较低的索引。