Pergunta

Eu sou novo para a programação e não consegue encontrar ou saber o que procurar para depurar o segmento que é iniciado com o Método SendAsync. O código funciona bem usando o método send mas quando se utiliza SendAsync ele vai para waiter.WaitOne (), mas eu nunca obter o retorno de chamada (I pense é o que sua chamado) para myPing_PingCompleted. Então, duas perguntas Como faço para depurar o código quando se inicia um novo segmento. Eu estou usando C # Express para que ele não pode ter todas as ferramentas debuging como VS. e alguma idéia de onde estou indo errado no meu código. Graças

using System;
using System.CodeDom;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Threading;
using System.Net;

private void btnPingAsync_Click(object sender, EventArgs e)
    {
        string bIP = txtStartIP.Text;
        string eIP = txtEndIP.Text;
        int timeOut;
        int cnt = 0;
        if (eIP == null) eIP = bIP;
        Ping myPing = new Ping();
        PingOptions parmPing = new PingOptions();
        AutoResetEvent waiter = new AutoResetEvent(false);
        myPing.PingCompleted +=new PingCompletedEventHandler(myPing_PingCompleted);
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] dataBuffer = Encoding.ASCII.GetBytes(data);
        if (!int.TryParse(txtTimeOut.Text, out timeOut)) timeOut = 120;
        parmPing.DontFragment = true;
        parmPing.Ttl = 32;
        pbQueueStatus.Minimum = 0;
        pbQueueStatus.Step = 10;
        pbQueueStatus.Value = 0;
        pbQueueStatus.Style = ProgressBarStyle.Continuous;




        if (verify.ValidIPAddress(bIP) && verify.ValidIPAddress(eIP))
        {
            IPQueue = build.IPAddressQueue(bIP, eIP);
            pbQueueStatus.Maximum = IPQueue.Count;
            pbQueueStatus.TopLevelControl.UseWaitCursor= true;
            pbQueueStatus.Visible = true;
            while (IPQueue.Count > 0)
            {
                myPing.SendAsync(IPQueue.Dequeue(), timeOut, dataBuffer, parmPing, waiter);
                waiter.WaitOne();
                if (++cnt > 10)
                {
                    pbQueueStatus.PerformStep();
                    cnt = 0;
                }
            }
        }
    }

    private void myPing_PingCompleted(Object sender, PingCompletedEventArgs e)
    {

        PingReply reply = e.Reply;
        ((AutoResetEvent)e.UserState).Set();
        if (reply .Status == IPStatus .Success )
        {
            dosomething;
        }
Foi útil?

Solução

Estou assumindo que você está colocando um breakpoinit no método myPing_PingCompleted mas que, quando no modo de depuração seu só não vai lá. Isso está certo?

O código jogando algum tipo de erro? Se você percorrer o código, não é chamar a myPing.SendAsync com os parâmetros corretos?

Eu apenas tentei o seu código (sem o IPQueue porque que se parece com sua classe personalizada). Ele funciona muito bem no meu fim. Eu usei um IP válido e o IP que não existe. Funcionou bem em ambos os casos.

Editar para obter novas informações

Ok eu só tentei em um aplicativo de formulário do Windows e ele não funciona. Quando eu tentei antes que fosse em um teste de unidade. Basicamente, parece que o fio usado para processar as janelas formulário e manipular os eventos não é capaz de ser usado para criar assíncrono solicitações (talvez porque é um segmento de primeiro plano). Mas, você pode obter arround-lo muito facilmente através da criação de uma outra linha para fazer o ping.

Na verdade, o ideal é assim que você teria que fazê-lo de qualquer maneira. Para que as janelas formam aplicativo não travar quando o fio está ocupado, um bom princípio é fazer todo o trabalho backround em um segmento separado. Isso manteria as janelas formam responsivo. Seja embora cuidadosa, ao tentar controla o acesso usando tópicos backround uma exceção será lançada. O melhor é ler todos os valores desejados em variáveis ??privadas e, em seguida, chutar de um segmento que vai fazer todo o trabalho, tem que atualização rosca outro conjunto de variáveis ??e depois ter o fio forground ler as variáveis ??e atualizar os controles.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top