在一个方法中改变 Textbox.text;由于 Return,for 循环未循环

Changing Textbox.text within a method; For loop not looping due to Return

下面是一个按钮,按下它会调用一个函数来 ping 一堆 IP 地址。如果 IP 地址 return 是一个响应,它会将 IP 地址添加到 output_networkSearch.Text。

private void button_networkSearch_Click(object sender, RoutedEventArgs e)
    {
        output_networkSearch.Text = networkSearch(Convert.ToInt32(input_searchLimit.Text)); 

    }

下面不是整个方法,只是我无法开始工作的部分。 for 循环从用户默认网关 IP 地址的最后一位数字开始,并在他们输入的任何限制 (1 - 255) 处停止。

// i等于默认网关IP中的最后一位,如果是192.168.0.1则i = 1.

for (int i = Convert.ToInt32(splitGatewayIP[3]); i <= searchLimit; i = i + 1)
                    {
                        // If the method receieves a ping reply...
                        if (PingHostSweep(gatewayIPRebuild + i))
                        {
                            // Returns 192.168.0. + i + ACTIVE
                            string response = gatewayIPRebuild + i + " ACTIVE";

                            return response;
                        }
                        else
                        {
                            string response = gatewayIPRebuild + i + " CLOSED";

                            return response;

                        }
                    }

这适用于控制台应用程序,但对于 WPF 应用程序,它似乎 运行 通过循环一次并由于 return 语句而停止。

我的解决方法是删除 Return 响应语句并尝试直接访问文本框 (output_networkSearch)。

所以我会做类似的事情:

for (int i = Convert.ToInt32(splitGatewayIP[3]); i <= searchLimit; i = i + 1)
                    {
                        // If the method receieves a ping reply...
                        if (PingHostSweep(gatewayIPRebuild + i))
                        {
                            // Returns 192.168.0. + i + ACTIVE
                            string response = gatewayIPRebuild + i + " ACTIVE";

                            output_networkSearch.Text = reponse;
                        }
                        else
                        {
                            string response = gatewayIPRebuild + i + " CLOSED";

                           output_networkSearch.Text = reponse;

                        }
                    }

但是,出于某种原因,我无法访问该方法中的文本框。我才刚刚开始学习 C#,所以我并不完全熟悉它的工作原理。

这是部分工作概念的图片。如您所见,限制设置为 10,因此它应该 ping IP 地址 1 到 10,并给出 ACTIVE 或 CLOSED 响应。这在我的控制台应用程序版本中确实有效。

WPF version

Console version

这可能对你有用

List<string> responses = new List<string>();
string response;
for (int i = Convert.ToInt32(splitGatewayIP[3]); i <= searchLimit; i = i + 1)
{
    if (PingHostSweep(gatewayIPRebuild + i))
    {
        response = gatewayIPRebuild + i + " ACTIVE";
    }
    else
    {
        response = gatewayIPRebuild + i + " CLOSED";
    }
    responses.Add(response)
}

现在在循环之后 responses 的列表将包含所有活动和关闭的 IP 的列表。就像您在控制台应用程序中所做的那样。

我认为你需要使用threading,后端需要很多子线程工作来扫描,当他们完成工作后将结果响应到MainForm,所以我写了一些代码希望能帮助你!

using System.Threading;
using System.Threading.Tasks;


        public void Start(string ip)
        {
            Task.Factory.StartNew(() =>
           {
                // If the method receieves a ping reply...
                string response;
               if (PingHostSweep(ip))
               {
                    // Returns 192.168.0. + i + ACTIVE
                    response = ip + " ACTIVE";
               }
               else
               {
                   response = ip + " CLOSED";
               }
               this.Invoke((MethodInvoker)(() => { textBox1.AppendText("\r\n" + response); }));

           });
        }


        private void button1_Click(object sender, EventArgs e)
        {

            for (int i = 1; i <= 255; i++)
            {
                Start(String.Format("192.168.100.{0}", i));
            }
        }

之前的答案是正确的(虽然它没有触及您最终需要学习的更高级的点......委托和调用......长话短说......现在不会让你厌烦) .

你写的内容提炼为:

// 旁注:您实际上不能将 IPv4 地址视为四个 "pure" 四边形(但这不是您的问题)

var notNecessarilyAHost = splitGatewayIP[3];
var searchStart = Convert.ToInt32(notNecessarilyAHost);
for (var i = searchStart; i <= searchLimit; ++i)
{
    if (PingHostSweep(gatewayIPRebuild + i))
    {
        return $"{gatewayIPRebuild}{i} ACTIVE";
    }
    else
    {
        return $"{gatewayIPRebuild}{i} CLOSED";
    }
}

...并且如果您(在精神上)逐步完成您所写的内容,则很容易看到循环只会循环一次。进入循环后,i 将等于 searchStart 是什么。然后你进入if测试。如果该测试为真,则您落入分支的真实一侧(即“...ACTIVE”)。否则,您将进入 else 分支(即“...已关闭”。从那里...

你总是return。这将退出循环(以及包含它的函数)。您将永远不会再次循环循环。 "break" 和 "return" (并且貌似转到......但那是另一天)将始终退出当前范围(范围是由'{'和'}'包裹的代码块(无论是他们显式或隐式写入)。

正在关注?

前面的回答是正确的。它会调整您的代码,以便循环将您在每次迭代中编写的字符串添加到字符串列表中。然后,当您退出循环时(因为我达到了 searchLimit),该字符串列表将包含 N 个很多字符串。您可能想要 return 或继续工作。

综上所述,您不能(从技术上讲可以,但您不应该)在 UI 线程中执行任何操作。如果这样做,UI 将在循环 运行s(以及它进行的网络调用 运行)等期间阻塞(并变得 100% 对用户无响应)