DataGridView显示列索引0
处的主机名、网络上的计算机/打印机名称。
pc1
pc2
print3
pc5
print
....
有500多个这样的名字。
我知道怎么联系他们
For i = 0 To DataGridView1.Rows.Count - 1
Try
If My.Computer.Network.Ping(DataGridView1.Item(0, i).Value) = True Then
DataGridView1.Rows(i).DefaultCellStyle.BackColor = Color.Lime
Else
DataGridView1.Rows(i).DefaultCellStyle.BackColor = Color.Red
End If
Catch ex As Exception
DataGridView1.Rows(i).DefaultCellStyle.BackColor = Color.Red
End Try
Next
问题是Ping需要很长时间,应用程序会冻结。
如何加快这一进程?
假设该节点不可用,则只需将其从列表中删除即可。
1条答案
按热度按时间hc2pp10m1#
使用Ping类Ping.SendPingAsync()提供的异步版本同时Ping多个地址的示例。
这个版本是可等待的,与Ping.SendAsync()方法不同,仍然是 * 异步 * 的,但是是事件驱动的。
由于您使用DataGridView来存储IpAddress/HostName并显示
PingReply
结果,因此需要确定一种方法来匹配Ping结果,以纠正获取Ip/Host地址的DataGridView的Cell。在这里,我将Row的Index传递给方法,因此当Ping结果异步返回时,我们可以将响应与DataGridView中的特定Cell相匹配。
为了使 initialization 方法更通用,我还传递了存储Ip/Host地址的Column的索引和将显示结果的Column的索引(您也可以只传递所有索引,而不是DataGridView Control引用到该方法并以不同的方式处理结果)。
一个循环从DataGridView中提取地址并创建一个**
List(Of Task)
**,为找到的每个地址添加一个PingAsync()
任务。当收集完成时,
List(Of Task)
被传递给Task.WhenAll()方法,然后等待该方法。此方法启动列表中的所有Task,并在所有Task都有结果时返回。
►请注意,Ping过程将
TimeOut
设置为5000ms
,因此所有任务都将在该时间间隔之前或之内返回,无论成功与否。然后,您可以决定是否要重新安排失败的Ping。
UI更新是使用Progress委托处理的。它只是一个方法(Action委托),当Ping过程有结果要显示时调用。
当更新UI的方法在不同的线程中运行时,也可以使用它:Report()方法将调用创建委托的线程中的Progress对象委托:UI线程,在这里(在示例中,我们实际上并没有离开它)。
它是这样工作的:
假设您从
Button.Click
事件处理程序启动ping序列。注意,处理程序被声明为
async
。初始化方法和
IProgress<T>
报告处理程序:PingAsync
工作方法: