我有一个我在visual basic中创建的程序,可以实时显示连接是否处于活动状态。它通过ping连接来完成此操作。如果收到响应,则连接名称旁边的块会亮起绿色。如果它没有收到响应,则该块变为红色。 我编码的一个例子如下;
If My.Computer.Network.Ping("10.128.73.84") Then
Button1.BackColor = Color.FromArgb(92, 194, 92)
Else
Button1.BackColor = Color.FromArgb(181, 64, 67)
End If
当所有连接都处于活动状态且为绿色时,程序可以快速顺畅地运行。断开越多,运行越慢越慢;到了无法使用的程度。
我注意到如果我每次点击它都会创建一个请求ping响应的按钮,那么当有连接的东西时它会非常快速地工作。我猜这是因为它只在一次请求后收到响应,而如果它断开连接,它会发送多个请求,只在一定数量后才放弃。
我的问题是:我做错了什么/错误地使用ping请求?或者是否有另一种获得我想要的结果的方法,而基本上不必导致程序冻结。
答案 0 :(得分:0)
这是C#中的一个异步示例,可以在后台线程上完成工作。
private async void _btnPing_Click(object sender, EventArgs e)
{
bool reachable = false;
try
{
_btnPing.Enabled = false;
_btnPing.BackColor = SystemColors.Control;
using (CancellationTokenSource cts = new CancellationTokenSource())
{
reachable = await SendPingAsync(_tbIPAddress.Text, cts.Token);
}
if (reachable)
_btnPing.BackColor = Color.Lime;
else
_btnPing.BackColor = Color.Red;
}
catch(Exception ex)
{
Debug.WriteLine("Form1._btnPing_Click exception: " + ex);
}
finally
{
_btnPing.Enabled = true;
}
}
private async Task<bool> SendPingAsync(string ipAddress, CancellationToken cancelToken, int timeout = 5000)
{
var taskPing = Task.Factory.StartNew<bool>(() =>
{
bool reachable = false;
try
{
Ping p = new Ping();
var res = p.Send(ipAddress, timeout);
reachable = (res.Status == IPStatus.Success);
}
catch (Exception ex)
{
Debug.WriteLine("Form1.SendPingAsync exception: " + ex);
}
return reachable;
}, cancelToken);
await taskPing;
return taskPing.Result;
}
如果单击Button
_ btnPing ,它将从TextBox
_ tbIPAddress 获取目标IP地址并执行异步ping操作