2011-06-13 45 views
3

我正在寫一個服務器,需要服務於大量的客戶端。我正在考慮什麼是最好的線程策略:我讀了.NET Framework上的ThreadPool類,在考慮參數(如運行機器的內核數量)後分配線程,這很好。但是,如果沒有線程可用,它將等待一個可用。C#服務器線程分配

我的套接字上的連接可能相當長,即一個線程可能會運行相當長的時間,然後纔會完成服務其客戶端並終止。因此,如果我爲每個套接字啓動一個新線程,理論上可能有大量線程處於空閒狀態(等待套接字上的數據),但仍然被認爲正在運行,從而阻止ThreadPool分配新的線程和服務其他客戶端。另一方面,使用預定義數量的線程爲所有套接字提供服務並不能最大限度地利用機器的多個內核。

我假設有一個更好的方法來做到這一點...任何建議?

謝謝。

回答

4

您想要使用asynchronous sockets。它們利用線程池,但在等待套接字上的數據時不會使用線程(即它們是非阻塞的)。

0

.NET ThreadPool比這更聰明。我建議使用Task/TaskScheduler框架或相關FCL類的APM模型。這幾乎肯定會優於任何手動線程產卵策略 - 除非你想出了一個beats'em所有...

0

我強烈推薦this視頻,傑弗裏·裏希特給出了一個關於一般多線程和線程池的討論。他還提到了服務器多線程的最佳策略