c# - 使用Ping映射事件IP的线程问题-C#

标签 c# .net multithreading backgroundworker ping

我正在尝试创建一个简单的网络工具来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/

相关文章:

c++ - pthread_join - 多个线程等待

c - 更好地理解并发(带锁)

c# - 使用 lambda 表达式的 List 或 Array 的 sumproduct

c# - 如何使用 ILoggerBuilder 的扩展方法而不是 ILoggerFactory?

c# - Windows 安全登录表单?

c# - 远程关闭后保持管道打开的最佳方法

.net - 如何使用.net Core设置AWS凭证

c# - 使用单个网站进行身份验证的多个 MVC5 网站 (ASP.NET Identity v2)

.net - 使用 Azure 识别的命名实体识别国际电话号码

Python - ThreadPoolExecutor 阻塞。如何解锁