Непрерывно вызывайте метод в фоновом режиме
Мне действительно нужно проконсультироваться в проблеме о BackgroundWorker
, Мое приложение, при выполнении других задач, должно периодически проверять соединение между моим ПК и другими (с помощью ping). Есть 19 удаленных компьютеров для проверки, что занимает около 3 минут для проверки связи. Так что наверняка я положил этот метод пинга в BackgroundWorker
, И я использую этот код:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (!worker.CancellationPending)
{
Stopwatch sw = Stopwatch.StartNew();
LoadList(); // This's the method to ping
sw.Stop();
// Console.WriteLine("Elapesd time:"+ sw.Elapsed.Seconds.ToString());
int elapsed = 1000 - (int)sw.ElapsedMilliseconds;
if (elapsed <= 0)
elapsed = 0;
Thread.Sleep(elapsed);
//}
}
e.Cancel = true;
}
Я хочу, чтобы каждый 1 Loadlist()
запускается, чтобы проверить, доступен ли удаленный компьютер или нет. Но странным является то, что если удаленный компьютер отключен, через 1 с я могу это выяснить (в моем списке этот компьютер меняет цвет), но если он был вновь подключен, возможно, через 3 минуты я смог бы это выяснить! Я не могу понять, почему это так! Кто-нибудь может объяснить мне об этом? или у кого-нибудь есть лучшее решение для достижения моей цели? Заранее спасибо!
Редактировать: это мой метод Loadlist():
private void LoadList()
{
for (int i = 1; i < 19; i++)
{
address[i] = "10.4." + i.ToString() + ".2";
deposit[i] = PingHost(address[i]); //My PingHost() method returns a bool
if (deposit[i]) // if this deposit[i] is true, the address[i] is pingable
treeView2.Nodes[i].BackColor = Color.Green;
else
{
address[i] = "10.2." + i.ToString() + ".2";
deposit[i] = PingHost(address[i]);
if (deposit[i])
treeView2.Nodes[i].BackColor = Color.Green;
else
treeView2.Nodes[i].BackColor = Color.Transparent;
}
}
}
1 ответ
То, что вам нужно, это Timer
, а не фоновый работник. Таймер не будет принимать какие-либо ресурсы процесса между тиками, тогда как спящий фоновый работник будет.
Если это долгоживущий таймер, убедитесь, что вы держите точную ссылку на таймер, чтобы он не собирался мусором.