none
Gibt es ping auch nicht blockierend? RRS feed

  • Frage

  • Hallo,

    während ich einen ping ausführe ist die Applikation blockiert.

    Meine Frage:

    Gibt es auch ein ping was nicht blockierend ist, oder muss ich das

    selbst programmieren?

    Außerdem suche ich Beispiel in dem eine VPN-Verbindung in C# erstellt wird.

    Gruß Michael

     

    Freitag, 20. August 2010 07:39

Antworten

  • Hallo Michael,

    da nunmal der Sinn eines Ping ist, auf die Antwort zu warten,
    mußt schon einen Codeteil damit beschäftigen.
    Das einfachste ist es das Ping in einen BackgroundWorker zu verfrachten.
    Ein Beispiel hatte ich mal gegeben in: Perfomance Probleme und zum Anfang der Datei springen

    Zum Verbindungsaufbau via VPN mußt Du in der Regel schon die Software bemühen.
    Ein Beispiel für RAS findest Du z. B.
    http://geekswithblogs.net/thibbard/articles/CSharpCodeToMaintainVPNConnectionProgramatically.aspx
    Eine komplexere Biblithek: http://dotras.codeplex.com/

    Gruß Elmar

     

    Freitag, 20. August 2010 08:00
    Beantworter
  • Hallo,

    anscheinend führst du den Ping in dem selben Thread aus in dem auch deine GUI läuft, das führt dazu, dass das Programm nicht mehr reagiert, bis der Ping abgeschlossen ist.

    Wenn du mal die Ping Klasse anschaust wirst du feststellen, dass diese die Methode SendAsync() besitzt, diese Methode führt den Ping automatisch in einem seperaten Thread aus. Wenn du dann noch das PingCompletet Event registrierst wirst du automatisch benachrichtigt, sobald der Ping im Hintergrund abgeschlossen wurde.

    Konkret sieht das Ganze so aus:

        private void Form1_Load(object sender, EventArgs e) {
    
          System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
          p.PingCompleted += new System.Net.NetworkInformation.PingCompletedEventHandler(p_PingCompleted);
          p.SendAsync(...);
    
    
        }
    
        void p_PingCompleted(object sender, System.Net.NetworkInformation.PingCompletedEventArgs e) {
          //Wenn der ping Abgeschlossen ist wierd diese methode aufgerufen
          //Alle informationen stehen in dem übergebenen Parameter e
          MessageBox.Show(e.Reply.Status.ToString());
        }
    
    Hoffe das hilft dir weiter.


    MfG, Sebastian Gross
    Freitag, 20. August 2010 07:52

Alle Antworten

  • Hallo,

    anscheinend führst du den Ping in dem selben Thread aus in dem auch deine GUI läuft, das führt dazu, dass das Programm nicht mehr reagiert, bis der Ping abgeschlossen ist.

    Wenn du mal die Ping Klasse anschaust wirst du feststellen, dass diese die Methode SendAsync() besitzt, diese Methode führt den Ping automatisch in einem seperaten Thread aus. Wenn du dann noch das PingCompletet Event registrierst wirst du automatisch benachrichtigt, sobald der Ping im Hintergrund abgeschlossen wurde.

    Konkret sieht das Ganze so aus:

        private void Form1_Load(object sender, EventArgs e) {
    
          System.Net.NetworkInformation.Ping p = new System.Net.NetworkInformation.Ping();
          p.PingCompleted += new System.Net.NetworkInformation.PingCompletedEventHandler(p_PingCompleted);
          p.SendAsync(...);
    
    
        }
    
        void p_PingCompleted(object sender, System.Net.NetworkInformation.PingCompletedEventArgs e) {
          //Wenn der ping Abgeschlossen ist wierd diese methode aufgerufen
          //Alle informationen stehen in dem übergebenen Parameter e
          MessageBox.Show(e.Reply.Status.ToString());
        }
    
    Hoffe das hilft dir weiter.


    MfG, Sebastian Gross
    Freitag, 20. August 2010 07:52
  • Hallo Michael

    für asynch-Ping wäre wohl
    http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.sendasync.aspx

    Oder ggf. Alternative, eigenen Thread.

    für VPN-Verbindung stellt sich eher die Frage, warum dies aus C# sein soll, bzw wozu die Verbindung danach genutzt werden soll.
    Bei VPN kommt typisch auch die Angelegenheit mit den Anmeldedaten (User+password).
    Freitag, 20. August 2010 07:54
  • Hallo Michael,

    da nunmal der Sinn eines Ping ist, auf die Antwort zu warten,
    mußt schon einen Codeteil damit beschäftigen.
    Das einfachste ist es das Ping in einen BackgroundWorker zu verfrachten.
    Ein Beispiel hatte ich mal gegeben in: Perfomance Probleme und zum Anfang der Datei springen

    Zum Verbindungsaufbau via VPN mußt Du in der Regel schon die Software bemühen.
    Ein Beispiel für RAS findest Du z. B.
    http://geekswithblogs.net/thibbard/articles/CSharpCodeToMaintainVPNConnectionProgramatically.aspx
    Eine komplexere Biblithek: http://dotras.codeplex.com/

    Gruß Elmar

     

    Freitag, 20. August 2010 08:00
    Beantworter