使用ping请求时程序滞后

时间:2017-08-23 07:54:56

标签: .net vb.net windows winforms

我有一个我在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请求?或者是否有另一种获得我想要的结果的方法,而基本上不必导致程序冻结。

1 个答案:

答案 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操作