2012-11-14 207 views
1

上在一分鐘C#項目工作 - 的什麼,我試圖做的是一個總體思路...C# - 多個生產者線程與單個消費者線程

用戶有符號的一個或多個組合,他們感興趣, 每個組合將符號數據下載到csv,解析它,然後運行一組關於數據的規則, 根據這些規則的結果生成警報 組合應該下載數據等,每當設置的時間間隔已經過去了

我打算讓每個投資組合都運行在它自己的線程上,那樣當間隔已經過去時,每個portfo lio可以繼續下載數據,同時解析和運行規則,而不是一個接一個。警報應該被推送到另一個包含警報隊列的線程(!)。當它收到警報時,會將它們發送給客戶端。

有點多,但是用C#去解決這個問題的最好方法是什麼? - 使用線程,或者像後臺工作者一樣,只需在單獨的線程上運行警報隊列?

任何意見是非常讚賞,新的一些這方面的東西,以便隨時告訴我,如果我完全錯了:)

回答

4

您可以使用blocking collection。這是c#4.0中的新功能,用於支持生產者消費者場景。

它還支持1個消費者和多個生產者。

+0

是的,我正在看,或ConcurrentQueue持有警報消息 - 我猜這將運行在一個新的線程,每個組合將運行在它自己的線程以及只包含一個指向隊列的指針? – KingTravisG

+0

可能有更多的OO-ish使用一個將alert作爲參數的抽象方法來創建'SendAlerts'類。然後,您可以對其進行子類化,以將BlockingCollection和線程實現爲私有成員。這很好地封裝了客戶端的警報,並允許您在稍後必要時輕鬆更改它。 –

0

如果這完全是間隔驅動,你可以在每個時間間隔結束上傳警報到客戶端,那麼你可以使用一個簡單的方法:

當你的時間間隔定時器觸發:

  1. 使用TPL啓動同時執行的任務來解析數據,爲每個任務提供一種回調方法,將警報傳回主系統。
  2. 該回調將警報寫入受鎖定語句保護的List。
  3. 等待所有任務完成。然後執行延續例程將警報轉發給客戶端。
  4. 重新啓動間隔計時器。

如果你需要上傳完成之前開始處理下一個區間,你可以使用你寫一個清單雙緩衝的辦法,把那個給上傳方法,然後開始寫警報到新列表,在收集和上傳警報時在列表之間來回切換。