2014-10-20 81 views
3

我有兩個阻塞集合 - 一個比另一個更高的優先級。如果我使用TryTakeFromAny並首先指定更高優先級的BlockingCollection,是否可以保證首先查看更高優先級的隊列?C#BlockingCollection的TryTakeFromAny是否保證對BlockingCollection對象的順序檢查?

+0

我假設你的意思是'BlockingCollection',而不是'BlockingQueue'。 – 2014-10-20 18:39:35

+0

是的,你是對的。我會相應地改變。 – Salil 2014-10-20 18:47:53

回答

4

這沒有記錄,所以我會說不能保證它在將來不會改變。可能不建議長期依賴它。但是,BlockingCollection<T>.TryTakeFromAny目前通過對一個項目進行索引檢查(它檢查Count是否大於0,然後是TryTake)來遍歷所有集合,從而進行快速檢查。如果沒有找到物品,它會爲每個集合獲取一個內部等待句柄,並將它們傳遞給WaitHandle.WaitAny。這提供了保證:

此方法返回任何句柄信號。如果在調用過程中有多個對象發出信號,那麼返回值就是所有信號對象的索引值最小的帶信號對象的數組索引。

所以當前的實現的確會按要求運行。如果兩個集合同時獲得一個項目,則索引較低的索引將被採用。

+0

謝謝你的詳細解釋。 – Salil 2014-10-20 18:47:21

相關問題