我需要編寫一些使用TcpListener
的代碼。使用TcpListener
的對象有3種可能性:Listen,Stop Listen,Send message。這是我的代碼的外觀:C#中的線程和TcpListener#
現在,我不知道我知道我可以保持線程安全的,當我想停止監聽狀態(改變listenerEnable
是假的)。
此外,我不知道如何保持此線程安全,當我想發送一些消息到客戶端(在一些分離的方法),而不停止服務器偵聽器狀態。
感謝您的任何幫助。
我需要編寫一些使用TcpListener
的代碼。使用TcpListener
的對象有3種可能性:Listen,Stop Listen,Send message。這是我的代碼的外觀:C#中的線程和TcpListener#
現在,我不知道我知道我可以保持線程安全的,當我想停止監聽狀態(改變listenerEnable
是假的)。
此外,我不知道如何保持此線程安全,當我想發送一些消息到客戶端(在一些分離的方法),而不停止服務器偵聽器狀態。
感謝您的任何幫助。
我會建議等待一個事件而不是等待一個變量。在你當前的方案中,考慮你的循環測試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.
}
}
發送不會影響上面的循環,只要不是響應於上述連接請求。
編寫一個正確的,可擴展的套接字服務器並不簡單 - 我建議你找一個/買一個 - 這已經做過很多次了。
要回答你的問題,你的問題是AcceptTcpClient
是一個阻塞呼叫。您需要使用以BeginXXX
和EndXXX
(如MSDN BeginAcceptTcpClient)開頭的APM(異步編程模型)方法。
這些方法不會阻塞線程,但您必須處理併發。