2012-04-24 14 views
5

我需要通過專有協議通過TCP連接數千個客戶端以循環獲取數據。我需要用C#編寫.NET服務器應用程序。通過數千個TCP套接字輪詢

第一次嘗試是爲每個TCP套接字創建一個自己的線程,該線程工作正常,但需要大量的CPU使用。

我發現改用.NET線程池會更好。據我所知(http://msdn.microsoft.com/en-us/library/ms973903.aspx)我可以使用定時器,以便讓每個套接字在給定的時間週期(如1秒)週期性地獲取數據。這對我來說不起作用,因爲一旦連接打開,套接字就會超時,因爲在打開套接字再次打開之前,有很多套接字必須打開。

另一個嘗試是使用異步回調。這會適用於我,但我不知道如何讓套接字週期性地獲取數據?

+2

「成千上萬」和「線索」這些詞不能相互結合。嘗試查看是否可以使用'await'關鍵字進行延續,這將允許您針對阻止端口編寫代碼,而不會經常實際阻止代碼。這就是Erlang和Stackless Python背後的原理 - 專爲網絡併發而構建的兩種語言。 – 2012-04-24 14:53:28

+1

爲什麼要循環客戶端來獲取數據?它會更簡單(儘管這是相對的),只需在每個套接字上保留一個異步讀取並在數據到達時處理數據。如果您真的需要循環讀取,則可以推遲異步讀取的重新發布,直到所有其他套接字都被服務。 – 2012-04-24 14:54:03

+1

只是不投票。 – 2012-04-24 14:54:04

回答

6

嘗試使用套接字的high performance API,該套接字允許在大量套接字上同時接收數據,而無需每個套接字使用一個線程。在文章的底部有一個完整樣本的鏈接。在MSDN文章中還有一個關於SocketAsyncEventArgs class的示例。

+0

Socket的高性能API似乎能夠處理大量的傳入連接。我需要打開這些連接。爲了達到這個目的,是否可以使用Socket的高性能API? – sqeez3r 2012-04-25 07:14:19

+1

是的,爲每個客戶端創建並打開一個套接字,然後使用['Socket.ReceiveAsync()'](http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socket.receiveasync.aspx )。 – 2012-04-25 08:46:19

+1

我用這種方式實現了它,它效果很好。謝謝! – sqeez3r 2012-10-26 09:41:46

0

爲什麼不用你需要輪詢的地址填充一個隊列,並讓你的線程池將項目從隊列中處理掉?

一旦你完成一個項目推到隊列的後面。

+3

首先,如果你有很多不活躍的連接,你會浪費很多時間無緣無故地檢查它們。 – 2012-04-24 15:00:37

+0

我認爲這需要花費太多時間來處理數千個連接。如果可能,我需要每秒鐘從所有套接字更新。 – sqeez3r 2012-04-24 15:16:40