2013-09-18 1 views
1

Я добавляю элементы в FlowLayoutPanel. Каждый элемент выполняет тест ping на IP-адрес и отправляет его вверх или вниз. У меня проблема: ничто не отправляется в FlowLayoutPanel, пока каждый элемент не получит результат. Я хочу, чтобы каждый элемент отправлялся по завершении и не дождался завершения всех этих действий. Я думал, что может быть способ использовать потоки для этого? На данный момент я не уверен. Некоторые рекомендации были бы замечательными! Вот как выглядит петля foreach:Опубликовать индивидуальные результаты FlowLayoutPanel без ожидания

  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++; 
      } 
+0

Какой версия .net вы ориентируетесь? –

+0

Причина, о которой я прошу, состоит в том, что некоторые действительно полезные пространства имен недоступны до .net 4.0, а именно System.Threading.Task ... и есть async/await в .net 4.5. В .net 2.0 вы можете использовать BackgroundWorker ... ответы на этот вопрос могут сильно различаться в зависимости от версии рамки, на которую вы нацеливаете. –

+0

Я использую .net 4. Я могу обновить до 4.5. У меня нет ограничений на то, какую версию я использую. – Pacobart

ответ

0

Существует много и много способов решить эту проблему.

Это должно дать вам представление о направлении, которое должно быть выполнено, должно работать под .net 4.0+ - обратите внимание, что поток основного/пользовательского интерфейса ожидает завершения цикла, поэтому у вас нет адаптивного пользовательского интерфейса, если это это происходит, но этот код создает 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, как результаты пинга приходят в

Смежные вопросы