在以下线程中,从客户端读取UDP数据包,直到 bool 字段Run设置为false为止。
如果在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
}
您将如何处理这个问题?有什么更好的办法吗?
最佳答案
使用UdpClient.Close()。这将终止阻塞的Receive()调用。准备捕获ObjectDisposedException,它向您的线程发出套接字已关闭的信号。
关于multithreading - C#处理线程和阻塞套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5525551/