我真的需要咨询有关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;
}
}
}
答案 0 :(得分:1)
您需要的是Timer
,而不是后台工作人员。计时器不会在任何一个进程的中间位置获取任何进程的资源,而睡眠的后台工作者将会这样做。
如果这是一个长寿命的计时器,请确保你对计时器保持强烈的引用,这样它就不会被垃圾收集。