Многопоточный хост пингуется приложения


Я работаю на приложения для мониторинга сети, которая пингует неизвестным количеством хозяев. Я сделал класс PingHost с функцией zping и я назвал его с помощью таймера каждые 2 секунды, чтобы позволить 2 пингов до конца, даже если один из них получает TimedOut. Но я думаю, что лучшим решением будет создать новый поток для каждого пинг, так что пинг каждого узла будет независимым.

Может кто-нибудь дать мне подсказку, как это сделать?

namespace pinguin
{
    public partial class Form1 : Form
    {
        public Form1()
        { 
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            PingHost caca = new PingHost();
            PingHost caca1 = new PingHost();
            this.label1.Text = caca.zping("89.115.14.160");
            this.label2.Text = caca1.zping("89.115.14.129");
        }

    }

    public class PingHost
    {
        public string zping(string dest)
        {
            Application.DoEvents();
            Ping sender = new Ping();
            PingOptions options = new PingOptions();
            options.DontFragment = true;

            string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
            byte[] buffer = Encoding.ASCII.GetBytes(data);
            int timeout = 50;
            int failed = 0;
            int pingAmount = 5;
            string stat = "";
            PingReply reply = sender.Send(dest, timeout, buffer, options);
            if (reply.Status == IPStatus.Success)
            {
                stat = "ok";
            }
            else
            {
                stat = "not ok!";
            }
            return stat;
        }
    }
}


7810
6
задан 8 марта 2011 в 04:03 Источник Поделиться
Комментарии
1 ответ

Вы можете использовать SendAsync:

sender.PingCompleted += new PingCompletedEventHandler (PingCompletedCallback);
sender.SendAsync(dest, timeout, buffer, options, textLabel);

И обратный вызов:

private static void PingCompletedCallback (object label, PingCompletedEventArgs e)
{
if (e.Reply.Status == IPStatus.Success)
{
label.Text = "ok";
}
else
{
label.Text = "not ok!";
}
}

Отказ от ответственности: я не запустите этот код. Я считаю, что делегат будет иметь доступ к этикетке, но у меня были проблемы с ним в прошлом.

5
ответ дан 8 марта 2011 в 06:03 Источник Поделиться