我有两个阻塞集合 - 其中一个比另一个优先级更高。如果我使用TryTakeFromAny并首先指定较高优先级的BlockingCollection,那么是否保证会首先查看较高优先级队列?
我有两个阻塞集合 - 其中一个比另一个优先级更高。如果我使用TryTakeFromAny并首先指定较高优先级的BlockingCollection,那么是否保证会首先查看较高优先级队列?
BlockingCollection<T>.TryTakeFromAny
方法通过循环索引检查项目(它检查 Count 是否大于 0 然后执行 TryTake
)进行快速检查所有集合。如果没有找到任何项目,它会为每个集合获取一个内部等待句柄,并将它们传递给 WaitHandle.WaitAny
。这提供了保证:
因此,当前实现确实会按照请求的方式运行。如果两个集合同时获取一个项目,则会取其中较小的索引。此方法在任何句柄发出信号时返回。如果在调用期间有多个对象发出信号,则返回值是所有发出信号对象中具有最小索引值的数组索引。