2012-01-18 40 views
3

我需要編寫一些使用TcpListener的代碼。使用TcpListener的對象有3種可能性:Listen,Stop Listen,Send message。這是我的代碼的外觀:C#中的線程和TcpListener#

現在,我不知道我知道我可以保持線程安全的,當我想停止監聽狀態(改變listenerEnable是假的)。

此外,我不知道如何保持此線程安全,當我想發送一些消息到客戶端(在一些分離的方法),而不停止服務器偵聽器狀態。

感謝您的任何幫助。

回答

3

我會建議等待一個事件而不是等待一個變量。在你當前的方案中,考慮你的循環測試listener變量是否爲真的情況。如果它進入循環並等待傳入​​連接,並且阻塞。因此,即使另一個線程將偵聽器變量設置爲false,您的循環也不會退出,直到有人連接到它並處理該連接。上述解決該問題的

的一種方式將是有這樣的代碼:

WaitHandle[] waitHandles = new WaitHandle[] {endlLoopEvent}; 
while(true) 
{ 
    int ret = WaitHandle.WaitAny(waitHandles, 100); 
    if(WaitTimeout == ret) continue; 
    else if(0 == ret) break; //our event has been signaled. 
    else 
    { 
     if(!server.Pending()) continue; //Go back to the loop if no connection pending 
     TcpClient client = server.AcceptTcpClient(); 
     // You can spawn a thread to service the request. 
    } 
} 

發送不會影響上面的循環,只要不是響應於上述連接請求。

2

編寫一個正確的,可擴展的套接字服務器並不簡單 - 我建議你找一個/買一個 - 這已經做過很多次了。

要回答你的問題,你的問題是AcceptTcpClient是一個阻塞呼叫。您需要使用以BeginXXXEndXXX(如MSDN BeginAcceptTcpClient)開頭的APM(異步編程模型)方法。

這些方法不會阻塞線程,但您必須處理併發。