2012-02-06 17 views
5

我使用NetTcpBinding服務和BasicHttpBinding服務創建了一個應用程序。 通過這些服務,客戶端嚮應用程序發送請求:這些請求必須放入Queue對象中,即入站請求的隊列。由多個線程併發訪問隊列

  1. 這兩個服務都必須允許來自客戶端的併發呼叫。
  2. 這意味着這兩個服務都應該同時訪問隊列以添加接收到的請求。
  3. 另外,另一個線程必須訪問隊列才能獲取和處理請求。

我可以使用ConcurrencyMode.Multiple,所以很多電話可以同時進行。但是,這並不保證對隊列的併發訪問。我應該把兩個ServiceHost放在兩個不同的線程中嗎?例如:

  • 第一個線程出隊並處理隊列中的請求。
  • 第二個線程實例化NetTcpBinding服務並將新請求排入隊列。此外,它通過回叫發送任何回覆。
  • 第三個線程實例化BasicHttpBinding服務並將新請求排入隊列。

這是我的想法。 因爲我幾乎是一個新手,如果你能給我一些建議,我將不勝感激。 也許我應該開始編寫三個併發訪問隊列的線程:目前前兩個線程可能會將隨機請求排入隊列,而第三個線程會使用這些請求。

+2

你必然要排隊?你可以使用ConcurrentQueue或BlockingCollection嗎?這是一個非常標準的生產者/消費者問題。 – Joe 2012-02-06 19:01:57

+0

@Joe:現在我應該使用集合不是線程安全的,如'Queue','Dictionary',等.. – enzom83 2012-02-06 20:20:10

+0

任何特別的原因?你只是最有可能重新實現輪子。 – Joe 2012-02-06 20:31:20

回答

3

既然你將自己定性爲「我幾乎是一個新手」我會建議你更一般的閱讀 - Threading in C# Joseph Albahari免費在線文章/書。它徹底地回顧了C#中線程的問題和工具。

我向你保證,仔細閱讀第3部分和第4部分(以及複習第1部分和第2部分)將爲您提供工具,以解決您目前的問題,而且還會解決許多其他問題,多線程。

如果你只是想快速回答你的問題,只要按照葉海亞的答案。

9

如果你在.NET 4上,你應該看看ConcurrentQueue<T>BlockingCollection

基本上這些是線程安全的集合,它們都是爲了高性能而實現的,並且大部分是無鎖的。

BlockingCollection專門針對Producer-Consumer-Scenarios(如您所描述的方案)實施。

更多信息參見: