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

6

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

1个回答

8
这并没有被记录下来,所以我会说不能保证它在未来不会改变。长期依赖它可能不是一个好主意。然而,当前的 BlockingCollection<T>.TryTakeFromAny 方法通过循环索引检查项目(它检查 Count 是否大于 0 然后执行 TryTake)进行快速检查所有集合。如果没有找到任何项目,它会为每个集合获取一个内部等待句柄,并将它们传递给 WaitHandle.WaitAny。这提供了保证:

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

因此,当前实现确实会按照请求的方式运行。如果两个集合同时获取一个项目,则会取其中较小的索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接