我如何等待C#中所有完成的异步ping加载?

时间:2011-07-15 10:36:23

标签: c# .net multithreading networking ping

我正在使用下面的代码开始加载异步ping。我还有一个由PingCompletedEventHandler调用的函数,该函数将成功ping的地址添加到列表中供以后使用。

我想知道在所有ping线程完成后如何调用函数?

    public static void PingRange(IPRange range)
    {

        foreach (IPAddress ip in range.GetAllIP())
        {
            // Create Pinger
            AutoResetEvent waiter = new AutoResetEvent(false);
            Ping pingSender = new Ping();
            pingSender.PingCompleted += new PingCompletedEventHandler(pingSender_PingCompleted);

            // Create a 32 byte data buffer
            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(data);

            // Wait 4 seconds for a reply
            int timeout = 4000;

            PingOptions options = new PingOptions(64, true);

            pingSender.SendAsync(ip, timeout, buffer, options, waiter);
            PingStartCount++;
        }
    }

2 个答案:

答案 0 :(得分:3)

如果您使用的是.NET 4.0,这相当容易。您可以使用CountdownEvent类代替PingStartCount计数器和waiter事件。 CountdownEvent将执行两者的工作。

public static void PingRange(IPRange range)
{            
    var finished = new CountdownEvent(1);
    foreach (IPAddress ip in range.GetAllIP())
    {
        finished.AddCount(); // Indicate that a new ping is pending
        var pingSender = new Ping();
        pingSender.PingCompleted +=
          (sender, e) =>
          {
            finished.Signal(); // Indicate that this ping is complete
          };
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        PingOptions options = new PingOptions(64, true);
        pingSender.SendAsync(ip, 4000, buffer, options, waiter);
    }
    finished.Signal(); // Indicate that all pings have been submitted
    finished.Wait(); // Wait for all pings to complete
}

答案 1 :(得分:1)

一个简单的解决方案是使用pingSender_PingCompleted事件处理程序中的PingStartCount变量来跟踪仍在等待完成的ping数(每次调用pingSender_PingCompleted时减去1)。一旦PingStartCount达到0,你就会收回所有ping。

然而,这并不是完全证据,因为当计数器达到0时,您可能仍然处于启动ping的过程中。为了确保不是这种情况,一个简单的bool变量在开始时设置为false PingRange和PingRange结束时为true,可以检查ping是否仍在发送。