C#Windows窗体ping.SendAsync与DataGridView问题

所以我有下面的代码。 我find了一个预览文章,并从这里工作。 但由于某种原因,它没有循环并更新具有回复状态的单元格。 它只更新列表中的最后一个IP。

private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) { var reply = e.Reply; DataGridViewRow row = e.UserState as DataGridViewRow; DataGridViewCell PingStat = row.Cells["cPing"]; if (!(reply == null)) { switch (reply.Status) { case IPStatus.Success: PingStat.Value = string.Format("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); break; case IPStatus.TimedOut: PingStat.Value = "Connection has timed out..."; break; default: PingStat.Value = string.Format("Ping failed: {0}", reply.Status.ToString()); break; } } } private void bPing_Click(object sender, EventArgs e) { String ip; Ping ping = new Ping(); foreach (DataGridViewRow row in dgvData.Rows) { if(!row.IsNewRow) { ip = row.Cells["cIPAddress"].Value.ToString(); ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); ping.SendAsync(ip, 1000, row); System.Threading.Thread.Sleep(5); } } } 

我在做什么不正确? 我认为与增加行ping .SendAsync它会跟踪所有回复对应的IP /行?

更新的代码,我正在与

  private static void ping_PingCompleted(object sender, PingCompletedEventArgs e) { var reply = e.Reply; DataGridViewRow row = e.UserState as DataGridViewRow; DataGridViewCell PingStat = row.Cells["cPing"]; if (reply != null) { switch (reply.Status) { case IPStatus.Success: PingStat.Value = string.Format("Reply from {0}: bytes={1} time={2}ms TTL={3}", reply.Address, reply.Buffer.Length, reply.RoundtripTime, reply.Options.Ttl); break; case IPStatus.TimedOut: PingStat.Value = "Connection has timed out..."; break; default: PingStat.Value = string.Format("Ping failed: {0}", reply.Status.ToString()); break; } } } private void bPing_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dgvData.Rows) { if (!row.IsNewRow) { Debug.WriteLine("Rows"); String ip; Ping ping = new Ping(); ip = row.Cells["cIPAddress"].Value.ToString(); ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); ping.SendAsync(ip, 1000, row); System.Threading.Thread.Sleep(5); } } } 

我认为问题在于你有一个Ping和一个IP,并且这些IP一直在重置,直到最后一行。 如果你将这些变量移动到foreach循环中,那么DataGridView中的每一行都将拥有“自己”的Ping和IP,所以你不会有每一行的问题有效的撤消前一个。

 private void bPing_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dgvData.Rows) { if(!row.IsNewRow) { String ip; Ping ping = new Ping(); ip = row.Cells["cIPAddress"].Value.ToString(); ping.PingCompleted += new PingCompletedEventHandler(ping_PingCompleted); ping.SendAsync(ip, 1000, row); System.Threading.Thread.Sleep(5); } } } 

另外,我不熟悉“Ping”,但是你可能想看看是否需要处理,或者把它放在Using循环中。

另外也不需要连续投一排。

那这个呢:

 private void bPing_Click(object sender, EventArgs e) { foreach (DataGridViewRow row in dgvData.Rows) { try { Ping pinger = new Ping(); PingReply reply = await pinger.SendPingAsync(row.Cells["cIPAddress"].Value.ToString(),1000); switch (reply.Status) { // do your stuff here } } catch (PingException) { // Handle exception here } } }