2012-07-07 43 views
2

我正在試驗System.Collections.Concurrent命名空間,但是我在實現我的設計時遇到問題。並行收集處理的應用程序設計

  1. 我的輸入隊列(ConcurrentQueue)正從線程中獲得填充,該線程在啓動時執行一些I/O以便讀取和解析。
  2. 接下來,我啓動輸入隊列上的Parallel.ForEach()。我正在爲每個項目做一些I/O綁定工作。
  3. 爲在ForEach()中處理的每個項目創建一個日誌項目並將其放入結果隊列中。

我想要做的是啓動日誌記錄我開始閱讀輸入,因爲我可能無法適應內存中的所有日誌項目。等待物品落入結果隊列的最佳方式是什麼?是否有我應該關注的設計模式或示例?

+0

您是否可以不使用System.Collections.Concurrent中的簡單BlockingCollection ?據推測,這種類型應該是一些「LogEntry」。 – 2012-07-07 02:46:56

回答

1

我認爲你要找的圖案是producer/consumer pattern。更具體地說,你可以有一個生產者/消費者implementation built around TPL and BlockingCollection

你想了解的主要概念是:

  1. Task
  2. BlockingCollection
  3. TaskFactory.ContinueWhenAll(可以讓你當一組任務/線程運行完成執行一些動作) 。
  4. 限制和阻止在BlockingCollection。這允許您爲輸出集合設置最大大小(出於內存原因),生產者線程將等待消費者拾取元素,以防達到指定的最大大小。
  5. BlockingCollection.CompleteAdding and BlockingCollection.IsCompleted它可以用來同步生產者和消費者(生產者可以說它什麼時候結束,消費者可以檢查並持續運行,直到生產者完成)。

更完整的示例在我鏈接的第二篇文章中。

在你的情況下,我認爲你希望消費者從結果隊列中取出東西並儘快處理它們(將它們寫入日誌存儲區或類似地方)。

因此,您最終收集的日誌項應該是BlockingCollection,而不是ConcurrentQueue