Непрерывно вызывайте метод в фоновом режиме

Мне действительно нужно проконсультироваться в проблеме о 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, а не фоновый работник. Таймер не будет принимать какие-либо ресурсы процесса между тиками, тогда как спящий фоновый работник будет.

Если это долгоживущий таймер, убедитесь, что вы держите точную ссылку на таймер, чтобы он не собирался мусором.

Другие вопросы по тегам