假設我有兩個隊列持有類似的消息類型以發送到端點。其中一個隊列(隊列A)具有最高優先級,因此必須始終首先發送它的消息。第二個隊列(隊列B)中的消息具有較低的優先級,只應在隊列A爲空時發送。我需要編寫一些包含這兩個隊列的代碼,並根據上述邏輯發送它們的內容。我假設我應該用一個新線程來做到這一點,這樣當隊列被清空並且我正在等待新消息到達時系統不會掛起。我想知道的是,這有一個很好的模式嗎?我應該使用C#「隊列」類型嗎?有什麼不該做的建議?提供單個端點的兩個隊列
0
A
回答
1
ConcurrentQueue<T> Class提供了一個線程安全的隊列實現。您可以將兩個實例粘合在一起以形成您的優先級隊列並實施,以便它可以包裝在BlockingCollection<T> Class中。然後任何線程都可以將項目添加到隊列中,並且一個線程使用GetConsumingEnumerable Method消耗項目。
enum Priority
{
Low,
High,
}
struct Prioritized<T>
{
public Priority Priority;
public T Item;
}
class PriorityQueue<T> : IProducerConsumerCollection<Prioritized<T>>
{
private readonly ConcurrentQueue<T> low;
private readonly ConcurrentQueue<T> high;
...
}
+0
當你看一個0和1的屏幕時,你看到矩陣嗎? – Brandon 2013-04-08 11:37:36
1
使用您的隊列BlockingCollection<T>
,並用ConcurrentPriorityQueue<T>
支持它,您將創建ConcurrentPriorityQueue
,並把它傳遞給the BlockingCollection
constructor that accepts an IProducerConsumerCollection
然後就沒重要的事情生產者線程添加不同的工作項目優先級,消費者線程將首先刪除高優先級的項目。
相關問題
- 1. RabbitQM多個隊列或單個隊列?
- 2. advancedDataGrid與兩個提供者
- 3. Nodejs提供1個api端點e一個html頁面
- 4. 合併兩個std ::隊列
- 5. 單個Azure服務總線隊列的多個客戶端
- 6. 找到我提供這個信息給定了兩個點
- 7. 提供一個提供商的單個實例爲組件
- 8. OpenID提供者端點不匹配發現的OpenID提供者端點
- 9. TFS任務隊列端點
- 10. 可以將兩個數組標記爲單個隊列嗎?
- 11. 每個客戶端的隊列請求
- 12. MassTransit:多個使用者,單獨的隊列/端點,郵件未遞送
- 13. plone提供ISchemaExtender的兩個適配器
- 14. 有兩個object.property和object.property.method()提供的CoffeeScript
- 15. 兩個提供相同的渲染
- 16. 查找兩個端點
- 17. OpenCL多個有序命令隊列與單個無序隊列
- 18. 有兩個索引的有序隊列
- 19. 使用兩個堆棧的隊列
- 20. 阻塞兩個隊列上的呼叫?
- 21. 的Heroku從SSL端點提供
- 22. 谷歌雲端點與另一個oAuth2提供商
- 23. 是否可以爲一個表單提供兩個提交按鈕?
- 24. Spring - 兩個持久化單元與不同的JPA提供者
- 25. 單點對點隊列和多個監聽器
- 26. 從Google App Engine提供多個端口
- 27. 一個ServiceHost,兩個端點(net.tcp&basic http)
- 28. 比較2個隊列並查找兩個隊列中不存在的元素
- 29. 從一臺服務器提供兩個站點(Apache和Node.JS)
- 30. 訪問提供了兩個.cpp文件
爲什麼不使用具有優先級的單個隊列,這裏有一些建議:http://stackoverflow.com/questions/4016509/concurrent-priority-queue-in-net-4-0 – 2013-04-08 11:34:01
所有這些實現問題取決於非常依賴於您的技術堆棧。即Web,桌面,WCF? – 2013-04-08 11:36:26