我正在尝试创建一个简单的网络工具来ping您本地子网上的所有可能的IP,并在DataGridView中提供此类IP的列表。我是新来的必须考虑线程处理的人,这是一个崭露头角的程序员,这是一件好事。抱歉,您可能需要向我做一些解释,但是在我看来,这应该可以工作。在尝试将其放入backgroundworker线程之前,该应用程序将挂起并给我“无响应”。
提前谢谢。
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
count = 0;
for (int j = 1; j < 255; j++)
for (int i = 1; i < 255; i++)
{
Ping ping = new Ping();
PingReply pingreply = ping.Send(IPAddress.Parse(locip[0] + "." + locip[1] + "." + j + "." + i));
if (pingreply.Status == IPStatus.Success)
{
status = "o";
repAddress = pingreply.Address.ToString(); ;
repRoundtrip = pingreply.RoundtripTime.ToString();
repTTL = pingreply.Options.Ttl.ToString();
repBuffer = pingreply.Buffer.Length.ToString();
string[] lineBuffer = { status, repAddress, repRoundtrip, repTTL, repBuffer };
ipList.Rows.Add(lineBuffer);
count += 1;
progressBar.Value += 1;
}
}
}
最佳答案
问题的一部分是您正在直接从后台线程访问UI元素。字段progressBar
大概是UI进度条控件,只能从UI线程安全地访问。您必须使用对.Invoke的调用才能从UI线程设置此值。
progressBar.Invoke(new MethodInvoker(UpdateProgressBarbyOne));
...
private void UpdateProgressBarByOne() {
progressBar.Value += 1;
}
关于c# - 使用Ping映射事件IP的线程问题-C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2105728/