在backgroundworker中连续调用方法

时间:2014-06-13 14:17:38

标签: c# backgroundworker

我真的需要咨询有关BackgroundWorker的问题。我的应用程序在执行其他任务时,应定期检查我的PC与其他人之间的连接(通过ping)。有19个远程计算机需要检查,大约需要3分钟才能ping通。所以我肯定把这个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;
}

我希望Loadlist()运行的每1秒检查远程PC是否可访问。但奇怪的是,如果远程电脑断开连接,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 个答案:

答案 0 :(得分:1)

您需要的是Timer,而不是后台工作人员。计时器不会在任何一个进程的中间位置获取任何进程的资源,而睡眠的后台工作者将会这样做。

如果这是一个长寿命的计时器,请确保你对计时器保持强烈的引用,这样它就不会被垃圾收集。