Пинг до нескольких IP-адресов с использованием backgroundworker

1

У меня есть массив с несколькими IP-адресами.

У меня есть рабочий метод для ping для IP:

        public static bool PingHost(string nameOrAddress)
    {
        if ( nameOrAddress == null || nameOrAddress == string.Empty)
        {              
            return false;
        }

        bool pingable = false;
        Ping pinger = new Ping();

        try
        {
            PingReply reply = pinger.Send(nameOrAddress);
            pingable = reply.Status == IPStatus.Success;
        }
        catch (PingException ex)
        {
            return false;
        }
        return pingable;
    }

Я использую backgroundworker (используя.Net 3.5) для запуска пинга. Когда он будет завершен, я изменяю GUI моей формы. Все работает отлично, когда я звоню на один IP-адрес. Но то, что я хочу сделать, - это запустить весь мой IP-адрес и мгновенно обновить форму после завершения одного IP-адреса. Таким образом, я должен уметь видеть результат первого IP, пока другие все еще пингируют.

private void backgroundWorkerPingHost_DoWork(object sender, DoWorkEventArgs e)
    {
        hostIsPingable = PingHost("www.google.be");
    }

    private void backgroundWorkerPingHost_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Cancelled == true)
        {

        }
        else if (e.Error != null)
        {
            MessageBox.Show("error:" + e.Error.Message);
            HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
            htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
        }
        else
        {
            if (hostIsPingable)
            {
                HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
                htmlDIV.Style = "width: 20px; height: 20px; background: green; border: solid black 1px;";
            }
            else
            {
                HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
                htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
            }
        }
    }
  • 1
    Похоже, вы можете захотеть посмотреть на событие ProgressChanged которое является частью BackgroundWorker .
  • 0
    не ProgressChanged только для отображения%, что фоновый работник закончил?
Показать ещё 2 комментария
Теги:
ping
backgroundworker

1 ответ

1
Лучший ответ

Установите backgroundWorkerPingHost.WorkerReportsProgress = True чтобы вы могли сообщать о прогрессе в поток пользовательского интерфейса.

private void backgroundWorkerPingHost_DoWork(object sender, DoWorkEventArgs e)
{
    foreach (...)  // a loop, since you said you're doing this multiple times
    {
        var hostIsPingable = PingHost("www.google.be");

        // Each time you get a response, report the result to the UI thread
        ((BackgroundWorker)sender).ReportProgress(0, hostIsPingable);
    }
}

private void backgroundWorkerPingHost_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    // Notified by the DoWork event. Get the result and do something with it
    var hostIsPingable = (bool)e.UserState;

    if (hostIsPingable)
    {
        HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
        htmlDIV.Style = "width: 20px; height: 20px; background: green; border: solid black 1px;";
    }
    else
    {
        HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
        htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
    }
}

private void backgroundWorkerPingHost_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled)
        return;

    // Leave stuff in here that you only want to do once when the worker ends
    if (e.Error != null)
    {
        MessageBox.Show("error:" + e.Error.Message);
        HtmlElement htmlDIV = webbSPPagina.Document.GetElementById("isPingable");
        htmlDIV.Style = "width: 20px; height: 20px; background: red; border: solid black 1px;";
        return;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню