c# Windows窗体ping.DataGridView的SendAsync问题
本文关键字:SendAsync 问题 DataGridView ping Windows 窗体 | 更新日期: 2023-09-27 18:06:43
所以我有下面的代码。我找到了一个预览帖子,并从这里开始工作。但是由于某些原因,它没有循环使用应答状态更新单元格。它只更新列表中最后一个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,这些不断重置,直到最后一行。如果你将这些变量移动到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
}
}
}