Dot-Net
BlockingCollection<> 中的元素順序
我有一個使用
BlockingCollection<>. 現在我想偶爾優先考慮一些下載。我認為將一些元素“向上”移動到集合中可能會很棒,比如在列表中,但是沒有像 Remove()/AddFirst() 或 Move() 這樣的方法。安排項目的首選方式是
BlockingCollection<>什麼?
BlockingCollection<T>通過包裝內部IProducerConsumerCollection<T>. 預設是在內部使用 a ,但您可以通過此建構子ConcurrentQueue<T>提供自己的實現。如果您提供自己的執行緒安全集合,則可以使用任何您想要的集合類型。這將允許您根據需要對元素進行優先級排序。
雖然沒有內置集合可以實現您想要的功能,但您可以將一對
ConcurrentQueue<T>集合包裝到一個實現IProducerConsumerCollection<T>. 這將允許您擁有“高優先級”和“低優先級”元素。
不幸的是,沒有辦法以您想要的方式重新排列隊列。您真正需要的是
PriorityBlockingCollection實現為優先級隊列,但可惜也不存在。您可以做的是利用該
TakeFromAny方法來獲得您想要的優先行為。將從實例TakeFromAny數組中取出第一個可用項。BlockingCollection它將優先於數組中首先列出的隊列。var low = new BlockingCollection<object> { "low1", "low2" }; var high = new BlockingCollection<object> { "high1", "high2" }; var array = new BlockingCollection<object>[] { high, low }; while (true) { object item; int index = BlockingCollection<object>.TakeFromAny(array, out item); Console.WriteLine(item); }上面的範例將列印:
high1 high2 low1 low2它迫使您使用多個隊列,因此它不是最優雅的解決方案。