2014-04-11 104 views
0

我有一個ListView和我嘗試使用此代碼添加服務器的信息:ping命令幾個服務器

foreach(string element in ids) 
{ 
    int id = Int32.Parse(element); 
    ListViewItem item = new ListViewItem(name[id]); 
    item.SubItems.Add(ip[id]); 
    Ping pingsv = new Ping(); 
    PingReply pingreply = pingsv.Send(ips[id],500); 
    if (pingreply.RoundtripTime == 0) 
     item.SubItems.Add("500+"); 
    else 
     item.SubItems.Add(pingreply.RoundtripTime.ToString()); 
} 

但問題是,該方案的ping服務器一個接一個,它需要大量的的時間來完成(我有80個IP的ping,並有可能在未來更多) 那麼有什麼辦法在同一時間ping所有ips?

+1

你可以使用多個線程。 – Crono

+0

Crono,試過但沒有工作。程序凍結,沒有任何錯誤。 –

+1

您是否嘗試過調試代碼以瞭解其凍結原因? – Crono

回答

5

按照Ping類,你可以使用異步事件:

foreach(string element in ids) 
{ 
    int id = Int32.Parse(element); 
    ListViewItem item = new ListViewItem(name[id]); 
    item.SubItems.Add(ip[id]); 
    Ping pingsv = new Ping(); 
    pingsv.PingCompleted += pingsv_PingCompleted; 

    pingsv.SendAsync(IPAddress, 500, id); 

} 

[... somewhere else in the same class ...] 

void pingsv_PingCompleted(object sender, PingCompletedEventArgs e) 
{ 
     long pingtime = e.Reply.RoundtripTime; 
     // do something with pingtime... 

     // id has been saved to UserState (see above) 
     string id = (string)e.UserState; 

     // do something with id... 

} 

編輯:添加代碼以顯示方法可行添加arbitary數據/對象。

+2

+1,但請小心。它最終可能會使用比進程可以處理的更多的線程。 – Crono

+0

如何從pingsv_PingCompleted函數中獲得foreach中的id? –