2009-09-16 8 views
0

Je suis novice en programmation et je ne peux pas trouver ou savoir ce qu'il faut rechercher pour déboguer le thread démarré avec la méthode SendAsync. Le code fonctionne bien à l'aide de la méthode Send, mais lors de l'utilisation de SendAsync, il passe à waiter.WaitOne() mais je ne reçois jamais le rappel (je pense que c'est ce qu'il appelle) à myPing_PingCompleted. Donc, deux questions comment déboguer le code quand il commence un nouveau thread. J'utilise C# Express donc il ne peut pas avoir tous les outils de débogage comme VS. et n'importe quelle idée où je vais mal dans mon code. MerciAide Ping Class SendAsync

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; 
     } 
+0

étrange, je l'ai copié l'exemple de l'aide en ligne qui a également échoué .. http://msdn.microsoft.com/en-us/library/ms144962.aspx –

+0

L'aide en ligne msdn pour la classe Ping était ce J'ai utilisé comme guide – DicksGarage

Répondre

0

Je suppose que vous mettez un breakpoinit dans la méthode myPing_PingCompleted mais en mode débogage juste pas aller là-bas. Est-ce correct?

Le code génère-t-il une erreur? Si vous parcourez le code, appelle-t-il myPing.SendAsync avec les bons paramètres?

J'ai juste essayé votre code (sans IPQueue parce que cela ressemble à votre classe personnalisée). Cela fonctionne bien de ma part. J'ai utilisé une adresse IP valide et quelle adresse IP n'existe pas. Cela a bien fonctionné dans les deux cas.

Modifier pour de nouvelles informations

Ok je viens d'essayer dans une application sous forme de fenêtres et IL NE FONCTIONNE PAS. Quand je l'ai essayé avant qu'il ne soit dans un test unitaire. Fondamentalement, il semblerait que le thread utilisé pour rendre les fenêtres de forme et de gérer les événements n'est pas capable d'être utilisé pour créer des demandes asynchrones (peut-être parce qu'il s'agit d'un thread de premier plan). Mais, vous pouvez l'obtenir facilement en créant un autre thread pour faire le ping.

En fait, idéalement, c'est comme ça que vous devriez le faire de toute façon. Pour que l'application Windows ne soit pas bloquée lorsque le thread est occupé, un bon principe est de faire tout le travail backround sur un thread séparé. Cela garderait la forme de fenêtre sensible. Attention cependant, lorsque vous essayez d'accéder aux contrôles en utilisant des threads backround, une exception sera levée. Il est préférable de lire toutes les valeurs souhaitées dans les variables privées, puis de lancer un thread qui fera tout le travail, mettre ce thread à jour avec un autre jeu de variables et ensuite le thread forground lira les variables et mettra à jour les contrôles.

+0

Oui, j'ai un point d'arrêt dans la première instruction de la méthode Terminé myPing_Ping. Lorsque vous passez par le programme, la dernière instruction à exécuter est la méthode waiter.WaitOne(), le formulaire reviendra mais ne sera pas complètement redessiné, puis rien. Cela se passe sur deux ordinateurs différents. Puis-je manquer une référence? J'ai ajouté les références que j'ai à l'exemple de code dans la question. – DicksGarage

+0

J'ai aussi essayé de mettre juste une adresse IP à la place d'IPQueue et la même chose arrive encore. – DicksGarage

+0

Merci qui a bien fonctionné. – DicksGarage