Почему несколько действий фоновых рабочих не являются асинхронными?C#

Место общения программистов C#
Ответить
Anonymous
 Почему несколько действий фоновых рабочих не являются асинхронными?

Сообщение Anonymous »

Я написал простое приложение на C# WPF для выполнения действий примерно на двадцати компьютерах через сеть.
Я создал класс 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»