1

FlowLayoutPanel に項目を追加しています。各項目は、IP アドレスに対して ping テストを実行し、そのアップまたはダウンを通知します。私が抱えている問題: すべての項目が結果になるまで、FlowLayoutPanel には何も投稿されません。各項目を完了として投稿し、すべてが完了するのを待ちません。これを行うためにスレッドを使用する方法があるかもしれないと思っていましたか? 現時点ではよくわかりません。いくつかのガイダンスは素晴らしいでしょう!foreach ループは次のようになります。

            string[] ipList = ipListTextBox.Text.Split(new string[] { Environment.NewLine }, StringSplitOptions.None);
            statusFlowPanel.Controls.Clear();
            statusFlowPanel.Controls.Add(p1);
            foreach (string ip in ipList)
            {;
                Label ipAddressLabel = new Label();
                ipAddressLabel.Text = ip;

                Label statusLabel = new Label();
                statusLabel.Text = "Status: ";
                statusLabel.Location = new Point(20, 10 + x);

                PictureBox updownPicBox = new PictureBox();
                updownPicBox.Height = 30;
                updownPicBox.Width = 30;
                updownPicBox.Location = new Point(80, 0);

                Ping pingSender = new Ping();
                IPAddress address = IPAddress.Parse(ip);
                PingReply reply = pingSender.Send(address);
                if (reply.Status == IPStatus.Success)
                {
                    updownPicBox.Image = Properties.Resources.up_arrow;
                }
                else
                {
                    updownPicBox.Image = Properties.Resources.down_arrow;
                }

                var ipPanel = new Panel();
                //Invoke(new Action(() => ));
                statusFlowPanel.Controls.Add(ipPanel);
                ipPanel.Controls.Add(updownPicBox);
                ipPanel.Controls.Add(statusLabel);
                ipPanel.Controls.Add(ipAddressLabel);
                ipPanel.Height = 40;
                x++;
            }
4

1 に答える 1

0

これについては、非常に多くの方法があります。

これにより、取るべき方向のアイデアが得られ、.net 4.0 以降で動作するはずです。メイン/UI スレッドはループが終了するのを待っているため、これが発生している間は応答性の高い UI を持っていないことに注意してください。このコードは を作成するList<Task>ので、好きな方法で実行できます。

private Panel GetStatusPanel(string ip)
{
    var result = new Panel();
    result.Controls.Add(new Label { Text = ip });
    Thread.Sleep(1000); // do the ping here, populate result panel accordingly
    return result;
}

private void button1_Click(object sender, EventArgs e)
{
    var ipList = new List<string> { "127.0.0.1", "192.168.0.1", "whatever" };

    statusFlowPanel.Controls.Clear();
    var tasks = ipList.Select(ip => new Task(() => 
        BeginInvoke((MethodInvoker)delegate
            {
                statusFlowPanel.Controls.Add(GetStatusPanel(ip));
                statusFlowPanel.Refresh();
            }))
        ).ToList();

    tasks.ForEach(t => t.Start());
}

statusFlowPanelこれにより、ping の結果が表示されるとステータス パネルが追加されます。

于 2013-09-27T01:54:11.443 に答える