2011-04-02 31 views
1

在以下线程中,UDP数据包将从客户端读取,直到布尔字段Run被设置为false。C#处理线程和阻塞套接字

如果在Receive方法被阻塞时Run被设置为false,它将永远保持阻塞状态(除非客户端发送数据,这将使线程循环并再次检查Run条件)。

while (Run) 
{ 
    IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); 
    byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method 

    // process received data 
} 

我通常通过在服务器上设置超时来解决问题。它工作正常,但对我来说似乎是一个零星的解决方案。

udpClient.Client.ReceiveTimeout = 5000; 

while (Run) 
{ 
    try 
    { 
     IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); 
     byte[] data = udpClient.Receive(ref remoteEndPoint); // blocking method 

     // process received data 
    } 
    catch(SocketException ex) {} // timeout reached 
} 

你会如何处理这个问题?有没有更好的方法?

回答

5

使用UdpClient.Close()。这将终止阻塞的Receive()调用。准备捕获ObjectDisposedException,它会向您的线程表明套接字已关闭。

1

你可以做这样的事情:

private bool run; 
public bool Run 
{ 
    get 
    { 
     return run; 
    } 

    set 
    { 
     run = value; 
     if(!run) 
     { 
      udpClient.Close(); 
     } 

    } 
} 

这允许你关闭任何一次满足条件,停止从听你的连接的客户端。可能会抛出异常,但我不相信它会是SocketTimeoutException,因此您需要处理该异常。

+0

只需在您致电关闭前致电断开连接,它不会引发异常。 – zezba9000 2014-08-24 06:42:32