[英]Thread-Safe Buffered Observable Priority Queue?
我正在編寫一個程序,其中一個線程需要將項目推送到隊列中,並且一個或多個線程將項目從隊列中彈出並處理它們。 為了避免內存不足,我希望生產者線程在隊列變滿時休眠。 有些項目的優先級高於其他項目,所以我希望首先處理這些項目。 如果項目具有相同的優先級,我希望首先添加的項目首先被處理。
我想在WPF DataGrid中顯示前100個項目,因此它也需要由UI線程訪問。 如果它可以通知UI線程也有更新,即實現IObservable,那將會很好。
是否有容器類可以完成所有這些操作?
對於獎勵積分,我很確定在排隊和出隊時都不需要鎖定整個隊列。
.NET 4實現很好。
你運氣不好尋找容器 - 你必須自己實施一個容器。 小心優先級 - 排序速度很慢。 我所做的是我自己實現了一個隊列類,內部使用多個數組(每個優先級一個 - 編碼低,中,高)。 這樣我從不排序。 如果可以,請避免使用鎖(假設為多核)並使用自旋鎖(.NET 4.0),它們在隊列方案中更快/更少開銷。
如果您使用的是.NET 4,則應該認真考慮使用自定義調度程序的任務並行庫 ,例如QueuedTaskScheduler示例。 我不確定它是否滿足您的所有要求,但這將是一個良好的開端。
我過去所做的是將多個ConcurrentQueue<T>
集合包裝成一個 - 這是TomTom所建議的 。 當您打算擁有的優先級數量很少時,這是非常合理的。 例如,在某些情況下,甚至可能有兩個:高和低。 然后你的TryDequeue
方法看起來像這樣:
public bool TryDequeue(out T item)
{
return _highItems.TryDequeue(out item) || _lowItems.TryDequeue(out item);
}
這不是您問題的全面答案,但也許它可以幫助您入門。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.