Как и другие вопросы о пинге, нам нужно пинговать несколько IP-адресов одновременно.Мы думали, что у нас все работает отлично, выполнив множество ответов и примеров, однако мы испытываем неудачные эхо-запросы из-за тайм-аута, когда мы пытаемся пинговать их одновременно или даже близко друг к другу.
Мы проверили нашсписок IP-адресов на другой программе мониторинга пинга и тайм-аут не происходит.Проблема специфична для нашего приложения.
В нашем приложении каждое «устройство» имеет класс RouterProperties, в котором хранятся его Имя, IP-адрес и т. Д. Мы отправляем эхо-запрос из наблюдаемой коллекции этих устройств, получая их IP-адреса.из их RouterProperties.
- Проверено разделение пингов на 10 (мс) / 20 (мс), ожидают task.delay
- Проверено разделение пингов на 10 (мс) / 20 (мс), используятаймер диспетчера
- Проверено эхо-тестирование одновременно без задержки, что приводит к наибольшему количеству тайм-аутов.
- Тестирование конвертации "строк" IP-адреса в IP-адрес до эхо-запроса, видимых изменений в проблеме нет.
- Проверено с таймаутом пинга 500 (мс), 1000 (мс), 5000 (мс) и т. Д.)
- Текущий тест предназначен для 143 устройств, но должен уметь обрабатывать больше.
//OUR MAIN PING SCHEDULER
private async void PingAllDevices(object sender, EventArgs e)
{
var allPingTasks = new List<Task>();
int numOfDevices = 1;
//Assign a task to each device.
foreach (RouterProperties device in devices)
{
await Task.Delay(10);
Console.WriteLine("Pinging device #" + numOfDevices + " : " + device.RouterIP);
numOfDevices++;
allPingTasks.Add(AsyncPingDevice(device));
}
//Block here for all created tasks.
await Task.WhenAll(allPingTasks);
}
}
//OUR PING TASK
async Task AsyncPingDevice(RouterProperties device)
{
// Get device IP address to ping.
string deviceIP = device.RouterIP;
try
{
Ping pingSender = new Ping();
PingOptions options = new PingOptions();
var reply = await pingSender.SendPingAsync(deviceIP, (int.Parse(Properties.Settings.Default.PingTimeout)), buffer, pingOptions);
Console.WriteLine(deviceIP + " has responded.");
if (reply.Status == IPStatus.Success)
{
device.PingCounter = 0;
}
else
{
if (device.PingCounter <= 3)
{
device.PingCounter++;
}
}
}
catch
{
if (device.PingCounter <= 3)
{
device.PingCounter++;
}
}
await Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action( () =>
{
if (device.IsDeactivated != true)
{
switch (device.PingCounter)
{
case 0:
device.Color = "#FF8AA587";
break;
case 1:
device.Color = "#FF9AB999";
break;
case 2:
device.Color = "#FFFCCEAA";
break;
case 3:
device.Color = "#FFF4837D";
break;
case 4:
device.Color = "#FFEB4960";
break;
}
}
}));
}
Когда мы запускаем наш код с задержкой task.de внутри планировщика ping и без нее, чтобы отделить пинги, мы получаем непоследовательные результаты от устройств, испытывающих эхо-запросы.
- Без задержки = 75% времени ожидания всех устройств.
- С задержкой = непостоянно случайное время ожидания 10% устройств за такт.
- Аналогичная программа проверки связик нашим = 100% последовательные результаты без каких-либо тайм-аутов.