В следующем потоке UDP-пакеты читаются с клиентов, пока в логическом поле Run не будет установлено значение false.
Если для параметра 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
}
Как бы вы справились с этой проблемой?Есть ли лучший способ?