2011-03-08 13 views
1

我正在編寫一個服務,它將連接到一個套接字,然後讀取連續且有時充足的數據。我接收的數據應該交給另一個線程(在服務中)進行處理,原因是處理可能需要一段時間,我不想阻止接收套接字。C#1套接字客戶端連續數據

我打算使用Begin或Async接收方法來處理數據,而不是讓一個線程運行讀取併發隊列或其他東西。我需要這個來擴展到通過套接字傳遞的大量數據。有什麼建議麼?

回答

5

我不知道如何使用異步接收將幫助處理。據我所知,你將有一個線程連接到套接字並讀取連續的數據流。我假設該線程可以將該連續流分解成某種類型的記錄,或者至少可以管理的大小的塊。然後您必須將這些數據提供給一個或多個處理線程。

我強烈建議您使用併發隊列(實際上是BlockingCollection)在讀取數據的線程與將執行處理的線程之間進行通信。有幾個原因,我建議使用BlockingCollection

  • 它易於使用 - 沒有明確的鎖碼
  • 它確實非忙等待
  • 它處理ñ讀者和N作家有效地

你是一個非常典型的生產者/消費者應用程序。生產者(讀取套接字的線程)獲取數據,將其放入隊列中,然後一個或多個使用者(處理線程)可以讀取和處理數據。我無法想象在.NET中比使用BlockingCollection更簡單,更有效或更高效的方法。

+0

是的。如果只有一個連接,那麼從套接字同步讀取的專用線程可能會是更好的選擇。當你處理多個連接時,異步方法真的會發光。 – spender 2011-03-08 15:24:34

+0

謝謝我有一個解決方案已經這樣設置,但使用併發隊列,因爲我只是將字節轉儲到隊列中。然後在另一個線程中分割數據。所以我需要它是FIFO,不知道阻塞收集是否。 – Mark 2011-03-08 15:45:15

+0

@Mark:BlockingCollection的默認後臺存儲爲ConcurrentQueue,因此默認爲FIFO。如果需要,您可以更改後備存儲,但是如果您需要先進先出隊列,那麼您可以使用默認值。 – 2011-03-08 15:51:01

1

我會用BeginXXXX方法,直到你發現它是一個性能瓶頸。 XXXXAsync方法實現起來相當複雜,除非您按照文檔中的描述使用固定數組和套接字SocketAsyncEventArgs,否則使用後面的API幾乎沒有意義。

+0

謝謝花。鑑於我從不希望進程停止接收,所以我只是在前一個BeginReceive的回調函數上再次調用BeginReceive? – Mark 2011-03-08 15:23:01

+0

是的,在重新開始之前,請確保您在回調中使用EndReceive。根據@ Jim的回答,使用同步方法的專用閱讀主題可能更適合您的目的。 – spender 2011-03-08 15:27:26

相關問題