2010-09-13 73 views
12

我需要建立一個阻塞pr​​iorty隊列,我的直覺是TakeFromAny可能是祕密成分,但該方法的文檔是稀疏的。它的目的是什麼/適當的使用/什麼是BlockingCollection.TakeFromAny方法有用的

我的要求是多個線程將添加到一個高優先級或低優先級隊列。一個線程將佔用這兩個始終從低優先級隊列之前的高優先級隊列中取得的隊列。

很有可能BlockingCollection或TakeFromAny方法對我都沒有任何用處。如果是這樣,那麼一個正確的方向指針將不勝感激。

回答

11

你說得對。文檔相當稀少。但是,我通過Reflector查看了實現,我相信您可以使用BlockingCollection.TakeFromAny方法來模擬您所期望的優先級偏差。原因是因爲實現使用返回所有信號對象的最小索引的WaitHandle.WaitAny方法。這意味着,如果您有兩個或更多可用項目的隊列,則始終選擇陣列中首先出現的隊列。

以下代碼應該始終輸出「high」。

var low = new BlockingCollection<object> { "low" }; 
var high = new BlockingCollection<object> { "high" }; 
var array = new BlockingCollection<object>[] { high, low }; 
object item; 
int index = BlockingCollection<object>.TakeFromAny(array, out item); 
Console.WriteLine(item); 
+1

非常及時的回覆感謝brian。你的回答與我觀察到的一致。我現在擔心的是,由於這種行爲沒有記錄,我相信多大的風險相信它不會從一個版本變爲另一個版本? – 2010-09-13 14:04:57

+1

@Ralph:我明白你的關心。我有一個懷疑,這是微軟之後的確切行爲,所以我的* hunch *是,它總是會這樣。如果把這些關鍵信息添加到文檔中以確認,那肯定會很好嗎? – 2010-09-13 14:20:53

+1

如果那是MS之後的行爲,它不會被稱爲'TakeFromFirstAvailable'嗎? – Gabe 2010-09-13 14:39:46