2016-07-01 7 views
0

Ich möchte eine Liste von IPs pingen, aber es funktioniert nicht.Multithread-Ping-IPs

Ich verwende diese Funktion bereits in der Konsole App und es funktionierte.

string[] addresses = { "192.168.1.2", "192.168.1.3", "192.168.1.4" }; 
    void show() 
    { 
     List<Task<PingReply>> pingTasks = new List<Task<PingReply>>(); 
     foreach (var address in addresses) 
     { 
      pingTasks.Add(PingAsync(address)); 
     } 

     Task.WaitAll(pingTasks.ToArray()); 
     int i = 0; 
     listView1.Clear(); 
     listView1.Columns.Add("Device IP", 100); 
     listView1.Columns.Add("ping", 60); 
     foreach (var pingTask in pingTasks) 
     { 
      string[] A = { addresses[i], pingTask.Result.RoundtripTime.ToString() }; 
      ListViewItem item = new ListViewItem(A); 
      listView1.Items.Add(item); 
      i++; 
     } 
    } 

    Task<PingReply> PingAsync(string address) 
    { 
     var tcs = new TaskCompletionSource<PingReply>(); 
     Ping ping = new Ping(); 
     ping.PingCompleted += (obj, sender) => 
     { 
      tcs.SetResult(sender.Reply); 
     }; 
     ping.SendAsync(address, new object()); 
     return tcs.Task; 
    } 

bitte helfen Sie mir.

danke

+0

definieren "funktioniert nicht" ... erhalten Sie einen Fehler? Welches Verhalten erwarten Sie und was passiert stattdessen? – jeroenh

+0

Wenn ich den Code-PC ausführen, funktioniert nicht mehr – Alireza

Antwort

0

Oder die Version Task.Factory.StartNew verwenden, ohne zu beenden zu warten, wenn ein IP-Finish es dann zur Listenansicht hinzufügen, Quick and Dirty, nur für Probe:

private void RunPing2() 
{ 
    listView1.Clear(); 
    listView1.Columns.Add("Device IP", 100); 
    listView1.Columns.Add("ping", 60); 

    string[] addresses = {"192.168.1.6", "192.168.1.3", "192.168.1.4", "google.com"}; 
    var syncObj = new object(); 
    foreach (var address in addresses) 
    { 
    Task.Factory.StartNew(() => 
    { 
     var ping = new Ping(); 
     try 
     { 
     var reply = ping.Send(address); 
     lock (syncObj) 
     { 
      Invoke(new MethodInvoker(delegate 
      { 
      string[] A = {address, reply.RoundtripTime.ToString()}; 
      var item = new ListViewItem(A); 
      listView1.Items.Add(item); 
      })); 
     } 
     } 
     catch (Exception) 
     { 
     } 
    }); 
    } 
}