2012-01-18 42 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(异步编程模型)方法。

这些方法不会阻塞线程,但您必须处理并发。