Я вижу две возможные причины вашей проблемы.
Кажется, вы создали задержку в 100 мс для каждого ответа от каждого отвечающего клиента в вашем проекте.Первое, что вы делаете в методе BeginReceive, - это спите, независимо от того, есть данные или нет.Для каждого ответа вы (correclty) вызываете BeginReceive для регистрации вашего нового обратного вызова приема.Но поскольку в каждый момент времени регистрируется только один ReceiveCallback, обработка каждого ответа займет не менее 100 мс.Если вы получаете одновременно 30 входящих вызовов клиента, последний будет задержан на 3 секунды.
В вашем ReceiveCallback вы вызываете свой метод OnFoundDevice.Это похоже на обратный вызов или обработчик событий.Любое время выполнения этого обратного вызова будет задерживать следующий обработанный ответ.Если обратный вызов занимает 1 минуту, следующий ответ будет отложен на 1 минуту (плюс 100 мс в вашем методе BeginReceive).
Предлагаемое решение: 1. Удалите задержку и условие из вашего BeginReceive,вот так.
public void BeginReceive()
{
sock.BeginReceive(new AsyncCallback(ReceiveCallback), udpState);
}
- Просмотрите работу, выполненную OnFoundDevice.Если это занимает много времени, перенаправьте вызов в другой поток (например, выполнив QueueUserWorkItem в пуле потоков).
Если причина, по которой вы использовали sleep в своем BeginReceive, заключалась в том, чтобы найти критерии, когдаОстановите прослушивание данных, вместо этого вы можете запустить таймер для этого в своем методе Start и вызвать Close на вашем сокете по истечении заданного времени или когда вы не получили данные в течение установленного промежутка времени.
Надеюсь, это поможет вам.