在后台工作者中不断调用方法

本文关键字:调用 方法 后台 工作者 | 更新日期: 2023-09-27 18:08:42

我有一个关于BackgroundWorker的问题需要咨询。我的应用程序在执行其他任务时,会定期检查我的电脑与其他电脑之间的连接(通过ping)。需要检查的远程计算机有19台,ping大约需要3分钟。我把ping方法放到了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;
}

我想每隔15秒Loadlist()运行检查远程pc是否可达。但奇怪的是,如果远程pc断开连接,15分钟后我可以发现(在我的列表中,这台pc改变颜色),但如果它是新连接的,也许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;
            }
        }
    }

在后台工作者中不断调用方法

你需要的是一个Timer,而不是一个后台工作者。计时器不会占用进程的任何资源,而休眠的后台工作线程会占用。

如果这是一个长期存在的计时器,请确保保持对计时器的强引用,以便它不会被垃圾收集。