我有一臺服務器有幾個客戶端C1 ... Cn,每個客戶端都建立了一個TCP連接。有不到10,000個客戶。順序訪問異步套接字
消息協議是基於請求/響應的,服務器向客戶端發送請求,然後客戶端發送響應。
服務器有幾個線程T1 ... Tm,並且每個線程都可以向任何客戶端發送請求。我想確保只有其中一個線程可以在任何時候向特定客戶端發送請求,而其他線程想要向同一客戶端發送請求將不得不等待。
我不想阻止線程同時向不同的客戶端發送請求。
E.g.如果T1向C3發送一個請求,另一個線程T2應該不能向C3發送任何東西,直到T1收到它的響應。
我想用插座上一個簡單的鎖聲明:
lock (c3Socket)
{
// Send request to C3
// Get response from C3
}
我使用異步插座,所以我可能要使用監視器來代替:
Monitor.Enter(c3Socket); // Before calling .BeginReceive()
而且
Monitor.Exit(c3Socket); // In .EndReceive
我很擔心東西出了問題,不放開顯示器,因此阻止所有acc給客戶。我在想,我的心跳線程可能會使用Monitor.TryEnter()超時並拋出無法獲取顯示器的套接字。
爲了能夠使用lock()語句,使Begin和End調用同步是否合理?我知道在這種情況下我會犧牲併發性,但這可能是值得的。
我可以在這裏忽略任何東西嗎?任何輸入讚賞。
我將套接字封裝在一個對象中(我稱之爲SocketHolder),所以這看起來像是一個顯而易見的地方,將忙/閒狀態。感謝這個想法。 – 2010-06-11 20:12:37