Я создал класс Physical_Machine, из которых я размещаю около двадцати итерации в коллекции для моего дисплея WPF. Класс включает в себя нестатического фонового работника, то есть фонового работника на каждую итерацию, который пингует машину. Вот упрощенный код:
Код: Выделить всё
public class Physical_Machine : INotifyPropertyChanged
{
public Brush Color_Background
{
get { return color_Background; }
set { color_Background = value; OnPropertyChanged(); }
}
private Brush color_Background;
private readonly BackgroundWorker wkVerif = new BackgroundWorker();
private string Name;
private string IP;
public Physical_Machine(string _name, string _ip)
{
Name _name;
IP=_ip;
wkVerif.DoWork += Action_WkVerif;
wkVerif.ProgressChanged += Progress_WkVerif;
wkVerif.WorkerReportsProgress = true;
wkVerif.WorkerSupportsCancellation = true;
wkVerif.RunWorkerAsync();
}
private void Action_WkVerif(object sender, DoWorkEventArgs e)
{
while (true)
{
try
{
using (Ping pinger = new Ping())
{
PingReply reply = pinger.Send(IP, 2000);
wkVerif.ReportProgress(0, reply);
}
}
catch (PingException piex)
{
wkVerif.ReportProgress(0, piex);
}
}
}
private void Progress_WkVerif(object sender, ProgressChangedEventArgs e)
{
if (e.UserState is PingReply lareply)
{
switch (lareply.Status)
{
case IPStatus.Success:
Color_Background = new SolidColorBrush(Color.FromArgb(255, 177, 254, 183));
break;
case IPStatus.TimedOut:
case IPStatus.DestinationHostUnreachable:
Color_Background = new SolidColorBrush(Color.FromArgb(255, 180, 180, 180));
break;
default:
Color_Background = new SolidColorBrush(Color.FromArgb(255, 255, 194, 130));
break;
}
}
if (e.UserState is PingException lexception)
{
Color_Background = new SolidColorBrush(Color.FromArgb(255, 255, 93, 81));
}
}
}
Код: Выделить всё
public ObservableCollection
Physical_Machines
{
get { return physical_machines; }
set { physical_machines= value; OnPropertyChanged(); }
}
private ObservableCollection physical_machines= new ObservableCollection();
Код: Выделить всё
Physical_Machines.Add(new Physical_Machine("SRV01", "192.168.1.101"));
Physical_Machines.Add(new Physical_Machine("SRV02", "192.168.1.102"));
Physical_Machines.Add(new Physical_Machine("SRV03", "192.168.1.103"));
...
Physical_Machines.Add(new Physical_Machine("SRV21", "192.168.1.121"));
Однако проверка ping не выполняется параллельно.
Это особенно заметно, если я запускаю программу без включения машины. SRV01 остается «неизвестным» в течение двух секунд, а затем меняется на «недоступный» (или, по крайней мере, соответствующий цвет). Затем через две секунды наступает очередь SRV02, затем через 2 секунды SRV03 и так далее. Например, если у меня в сети есть только SRV21, то при запуске программы мне придется ждать 40 секунд, чтобы получить информацию. Это потому, что мне приходится ждать таймаутов предыдущих 20 машин.
Логично, поскольку каждый объект Physical_Machine имеет своего собственного фонового работника, все пинги должны выполняться одновременно, но это не так. Почему пинги не выполняются независимо друг от друга?
Подробнее здесь: https://stackoverflow.com/questions/789 ... -not-async
Мобильная версия