Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2011, 05:24   #1
kpoko
 
Регистрация: 11.12.2011
Сообщений: 3
По умолчанию Асинхронный пинг множества хостов

Пытаюсь написать пингер. Есть множество хостов host[] которые нужно периодически пинговать, и есть массив pingTime[], который нужно заполнять результатами пинга. Как передать делегату значение переменной i? Текущий код неправильный и приводит к ошибке.

Код:
for (byte i = 0; i < allhosts; i++)
{
        Ping ping = new Ping();
        ping.PingCompleted += delegate(object sender, PingCompletedEventArgs e)
        {
                pingTime[i] = Convert.ToInt16(e.Reply.RoundtripTime);
                (ping as IDisposable).Dispose();
        }
        ping.SendAsync(host[i], timeout, new AutoResetEvent(false));
}
kpoko вне форума Ответить с цитированием
Старый 11.12.2011, 12:16   #2
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

если по рабочекрестьянски то в PingCompletedEventArgs - e.Reply.Address лежит то куда ты слал. А если как ты хочешь то импользовать Action с 2-мя параметрами 1-вый будет i второй куда слать, но судя по твоему коду лучше по рабочекрестьянски
http://msdn.microsoft.com/en-us/library/bb549311.aspx
Guy вне форума Ответить с цитированием
Старый 11.12.2011, 15:41   #3
kpoko
 
Регистрация: 11.12.2011
Сообщений: 3
По умолчанию

Спасибо что откликнулись. Метод рабочекрестьянский мне не подошел, т.к. он не работает когда хост представлен в виде доменного имени, а также когда в списке есть повторяющиеся IP. Заинтересовал второй метод. Я новичок в C#, по ссылке ходил, но не смог применить тот пример к своему случаю. Покажите пожалуйста как это должно выглядеть в виде кода?
kpoko вне форума Ответить с цитированием
Старый 11.12.2011, 18:13   #4
Guy
Форумчанин
 
Регистрация: 15.12.2010
Сообщений: 398
По умолчанию

Код:
using System;
using System.IO;
using System.Collections.Generic;
using System.Net.NetworkInformation;

public class TestLambdaExpression
{
    private static List<string> hosts = new List<string>() { "google.ru", "ya.ru", "mail.ru", "aaaaa213213123123.ru" };

    public static void Main()
    {
        Action<string> asyn = new Action<string>(Pinger);

        hosts.ForEach(e => 
        {
            asyn.Invoke(e);
        });

        Console.WriteLine("End");
        Console.ReadKey();
    }

    private static void Pinger(string hostAdress)
    {
        Ping png = new Ping();
        try
        {
            PingReply pr = png.Send(hostAdress);
            Console.WriteLine(string.Format("Status for {0} = {1}", hostAdress, pr.Status));
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("Status for {0} = {1}", hostAdress, ex.InnerException.Message));
        }
    }
}
Guy вне форума Ответить с цитированием
Старый 12.12.2011, 00:26   #5
kpoko
 
Регистрация: 11.12.2011
Сообщений: 3
По умолчанию

Спасибо большое, ваш код работает. Еще остался такой вопрос: когда разбирался с классом Ping, пытался пример из http://msdn.microsoft.com/ru-ru/libr...tion.ping.aspx переделать под свою задачу, но до конца не понял какие аргументы нужно отправлять. Можно ли такой вариант применить к моему случаю?
Код:
for (byte i = 0; i < allhosts; i++)
{
	Ping ping = new Ping();
	ping.PingCompleted += new PingCompletedEventHandler(PingCompletedCallback(i, ping, /*ЧТО СЮДА ПЕРЕДАТЬ?*/));
	ping.SendAsync(host[i], timeout, new AutoResetEvent(false));
}
////////////////////////////////
private void PingCompletedCallback(int i, object sender, PingCompletedEventArgs e)
{
	pingTime[i] = Convert.ToInt16(e.Reply.RoundtripTime);
}
kpoko вне форума Ответить с цитированием
Старый 08.02.2013, 09:50   #6
Eugene_M
 
Регистрация: 05.02.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Guy Посмотреть сообщение
Код:
using System;
using System.IO;
using System.Collections.Generic;
using System.Net.NetworkInformation;

public class TestLambdaExpression
{
    private static List<string> hosts = new List<string>() { "google.ru", "ya.ru", "mail.ru", "aaaaa213213123123.ru" };

    public static void Main()
    {
        Action<string> asyn = new Action<string>(Pinger);

        hosts.ForEach(e => 
        {
            asyn.Invoke(e);
        });

        Console.WriteLine("End");
        Console.ReadKey();
    }

    private static void Pinger(string hostAdress)
    {
        Ping png = new Ping();
        try
        {
            PingReply pr = png.Send(hostAdress);
            Console.WriteLine(string.Format("Status for {0} = {1}", hostAdress, pr.Status));
        }
        catch (Exception ex)
        {
            Console.WriteLine(string.Format("Status for {0} = {1}", hostAdress, ex.InnerException.Message));
        }
    }
}
Замечательный скрипт, он работает на "ура", но, если можно, не могли бы вы его "адаптировать" для работы не со списком, а с массивом... Прошу помощи))
Eugene_M вне форума Ответить с цитированием
Старый 08.02.2013, 13:27   #7
Reskov
Форумчанин
 
Аватар для Reskov
 
Регистрация: 17.12.2008
Сообщений: 250
По умолчанию

Кроко так Ваш первоначальный пример почти рабочий, чуть подправил
Код:
for (byte i = 0; i < allhosts; i++)
{
        Ping ping = new Ping();
        ping.PingCompleted += delegate(object sender, PingCompletedEventArgs e)
        {
                int val = Convert.ToInt32(e.UserState);
                pingTime[val] = Convert.ToInt16(e.Reply.RoundtripTime);
                (ping as IDisposable).Dispose();
        }
        ping.SendAsync(host[i], timeout, i);
}
Ps тьфу не заметил что год 2011)))))))))))))))
Reskov вне форума Ответить с цитированием
Старый 20.03.2013, 17:01   #8
Aleksey999
 
Регистрация: 18.03.2013
Сообщений: 6
По умолчанию Не смотря на дату :)

Цитата:
Сообщение от Reskov Посмотреть сообщение
Кроко так Ваш первоначальный пример почти рабочий, чуть подправил
Код:
for (byte i = 0; i < allhosts; i++)
{
        Ping ping = new Ping();
        ping.PingCompleted += delegate(object sender, PingCompletedEventArgs e)
        {
                int val = Convert.ToInt32(e.UserState);
                pingTime[val] = Convert.ToInt16(e.Reply.RoundtripTime);
                (ping as IDisposable).Dispose();
        }
        ping.SendAsync(host[i], timeout, i);
}
Ps тьфу не заметил что год 2011)))))))))))))))
Даже не смотря на дату: Спасибо!
Aleksey999 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Автоматизация создания виртуальных хостов, апач Gorychev Свободное общение 3 03.05.2011 23:52
Асинхронный вызов в C# q_proger C# (си шарп) 7 16.12.2010 23:27
ServerSocket и несколько хостов. noname Incognito Работа с сетью в Delphi 4 15.07.2010 12:59
Имена хостов :( InseR Работа с сетью в Delphi 1 04.07.2007 12:15