Как мне ждать загрузки асинхронных пингов, чтобы все завершилось в C #? - PullRequest
3 голосов
/ 15 июля 2011

Я использую код ниже, чтобы начать загрузку асинхронных пингов.У меня также есть функция, которая вызывается PingCompletedEventHandler, эта функция добавляет адрес успешного пинга в список для последующего использования.

Я хотел бы знать, как можно было бы вызвать функцию один раз для всехПинг-нити завершены?

    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 ]

3 голосов
/ 15 июля 2011

Это довольно легко, если вы используете .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 голос
/ 15 июля 2011

Простым решением будет использование переменной PingStartCount в обработчике событий pingSender_PingCompleted для отслеживания того, сколько эхо-запросов еще ожидает завершения (вычитайте 1 при каждом вызове pingSender_PingCompleted). Как только PingStartCount достигнет 0, вы получите все запросы.

Однако это не является полным доказательством, так как вы можете все еще находиться в процессе запуска пингов, когда счетчик достигает 0. Чтобы убедиться, что это не так, простая переменная bool, которую вы установили в false в начале PingRange и значение true в конце PingRange позволяют проверить, отправляются ли еще сообщения ping.

...