我正在編寫一個服務,它將連接到一個套接字,然後讀取連續且有時充足的數據。我接收的數據應該交給另一個線程(在服務中)進行處理,原因是處理可能需要一段時間,我不想阻止接收套接字。C#1套接字客戶端連續數據
我打算使用Begin或Async接收方法來處理數據,而不是讓一個線程運行讀取併發隊列或其他東西。我需要這個來擴展到通過套接字傳遞的大量數據。有什麼建議麼?
我正在編寫一個服務,它將連接到一個套接字,然後讀取連續且有時充足的數據。我接收的數據應該交給另一個線程(在服務中)進行處理,原因是處理可能需要一段時間,我不想阻止接收套接字。C#1套接字客戶端連續數據
我打算使用Begin或Async接收方法來處理數據,而不是讓一個線程運行讀取併發隊列或其他東西。我需要這個來擴展到通過套接字傳遞的大量數據。有什麼建議麼?
我不知道如何使用異步接收將幫助處理。據我所知,你將有一個線程連接到套接字並讀取連續的數據流。我假設該線程可以將該連續流分解成某種類型的記錄,或者至少可以管理的大小的塊。然後您必須將這些數據提供給一個或多個處理線程。
我強烈建議您使用併發隊列(實際上是BlockingCollection
)在讀取數據的線程與將執行處理的線程之間進行通信。有幾個原因,我建議使用BlockingCollection
:
你是一個非常典型的生產者/消費者應用程序。生產者(讀取套接字的線程)獲取數據,將其放入隊列中,然後一個或多個使用者(處理線程)可以讀取和處理數據。我無法想象在.NET中比使用BlockingCollection
更簡單,更有效或更高效的方法。
我會用BeginXXXX方法,直到你發現它是一個性能瓶頸。 XXXXAsync方法實現起來相當複雜,除非您按照文檔中的描述使用固定數組和套接字SocketAsyncEventArgs,否則使用後面的API幾乎沒有意義。
是的。如果只有一個連接,那麼從套接字同步讀取的專用線程可能會是更好的選擇。當你處理多個連接時,異步方法真的會發光。 – spender 2011-03-08 15:24:34
謝謝我有一個解決方案已經這樣設置,但使用併發隊列,因爲我只是將字節轉儲到隊列中。然後在另一個線程中分割數據。所以我需要它是FIFO,不知道阻塞收集是否。 – Mark 2011-03-08 15:45:15
@Mark:BlockingCollection的默認後臺存儲爲ConcurrentQueue,因此默認爲FIFO。如果需要,您可以更改後備存儲,但是如果您需要先進先出隊列,那麼您可以使用默認值。 – 2011-03-08 15:51:01