Dot-Net

BlockingCollection<> 中的元素順序

  • October 30, 2015

我有一個使用BlockingCollection&lt;&gt;. 現在我想偶爾優先考慮一些下載。我認為將一些元素“向上”移動到集合中可能會很棒,比如在列表中,但是沒有像 Remove()/AddFirst() 或 Move() 這樣的方法。

安排項目的首選方式是BlockingCollection&lt;&gt;什麼?

BlockingCollection&lt;T&gt;通過包裝內部IProducerConsumerCollection&lt;T&gt;. 預設是在內部使用 a ,但您可以通過此建構子ConcurrentQueue&lt;T&gt;提供自己的實現。

如果您提供自己的執行緒安全集合,則可以使用任何您想要的集合類型。這將允許您根據需要對元素進行優先級排序。

雖然沒有內置集合可以實現您想要的功能,但您可以將一對ConcurrentQueue&lt;T&gt;集合包裝到一個實現IProducerConsumerCollection&lt;T&gt;. 這將允許您擁有“高優先級”和“低優先級”元素。

不幸的是,沒有辦法以您想要的方式重新排列隊列。您真正需要的是PriorityBlockingCollection實現為優先級隊列,但可惜也不存在。

您可以做的是利用該TakeFromAny方法來獲得您想要的優先行為。將從實例TakeFromAny數組中取出第一個可用項。BlockingCollection它將優先於數組中首先列出的隊列。

var low = new BlockingCollection&lt;object&gt; { "low1", "low2" };
var high = new BlockingCollection&lt;object&gt; { "high1", "high2" };
var array = new BlockingCollection&lt;object&gt;[] { high, low };
while (true)
{
 object item;
 int index = BlockingCollection&lt;object&gt;.TakeFromAny(array, out item);
 Console.WriteLine(item);
}

上面的範例將列印:

high1
high2
low1
low2

它迫使您使用多個隊列,因此它不是最優雅的解決方案。

引用自:https://stackoverflow.com/questions/7502615