在后台工作者中不断调用方法
本文关键字:调用 方法 后台 工作者 | 更新日期: 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分钟后我可以发现!我不明白这是为什么!有人能给我解释一下吗?或者谁有更好的办法帮我实现我的目标?提前感谢!
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
,而不是一个后台工作者。计时器不会占用进程的任何资源,而休眠的后台工作线程会占用。
如果这是一个长期存在的计时器,请确保保持对计时器的强引用,以便它不会被垃圾收集。