這不是一個問題,說真的,我只是在尋找一些準則:) 我目前正在寫這應該使用的線程低數量,因爲它可以一些抽象的TCP服務器。非阻塞TCP服務器
目前它的工作方式如下。我有一個線程正在監聽和一些工作線程。 Listener線程只是坐等客戶端連接我希望每個服務器實例有一個單一的監聽器線程。工作線程正在客戶端套接字上執行所有讀/寫/處理任務。
所以我的問題是建立有效的工作進程。我遇到了一些我仍然無法解決的問題。工人代碼是類似的東西(代碼是非常簡單的只是爲了顯示一個地方,我有我的問題):
List<Socket> readSockets = new List<Socket>();
List<Socket> writeSockets = new List<Socket>();
List<Socket> errorSockets = new List<Socket>();
while(true){
Socket.Select(readSockets, writeSockets, errorSockets, 10);
foreach(readSocket in readSockets){
// do reading here
}
foreach(writeSocket in writeSockets){
// do writing here
}
// POINT2 and here's the problem i will describe below
}
它的工作原理都smothly接受,因爲while循環是循環的100%的CPU使用率一遍,如果我讓我的客戶端執行send-> receive-> disconnect例程,這並不是那麼痛苦,但是如果我試着保持活動,再次send-> receive-> send->再接收一遍,它確實會吃掉所有的CPU。所以我的第一個想法是在那裏安排睡眠,我檢查是否所有的套接字都有數據發送,然後將Thread.Sleep放在POINT2中,持續10ms,但是這10ms之後,當我想要接收下一個時間時,會產生10ms的巨大延遲命令從客戶端套接字。例如,如果我不試圖「保持活着」命令正在執行10-15毫秒內,並保持活着它變得更糟的至少10毫秒:(
也許這只是一個糟糕的架構?有什麼辦法可以讓我的處理器無法獲得100%的利用率,而我的服務器會盡快對客戶端插座上出現的問題做出反應?也許有人可以指出一個非阻塞服務器和它應該維護的體系結構的一個好例子嗎?
它會產生大量的線程,不是嗎?我使用循環,所以我可以通過讀/寫一個小緩衝區來處理一個線程中的大量套接字。 – hoodoos 2010-04-25 18:38:26
我想它會的。你確定這是一個問題嗎?在任何情況下,你可以發佈你的確切代碼,導致100%的CPU?避免它的一個想法是有一個特殊的「保持活着」的消息,像服務器發送「ping?」的東西。給客戶**每x秒**並期待「pong!」在下一個「平?」之前?應該發送。如果它不來,則假設連接斷開。這樣你就沒有睡覺了。保持活力只是每60秒完成一次,而不是等。例如,您可以使用AutoResetEvent來指示何時應發送保持活動狀態,具體取決於代碼我認爲 – IVlad 2010-04-25 18:55:40
@hoodoos您可以在單個線程上使用TcpListener BeginAccept,在下一次調用BeginAccept()你的AsyncCallback。在聽另一個連接之前,您可以完全處理一個連接。 – khargoosh 2016-08-16 01:23:59