Zugriffsverletzungsausnahme kann ausgelöst werden, wenn Sie die Ping.send-Methode wiederholt aufrufen

Dieser Artikel enthält Informationen zum Beheben eines Problems, bei dem beim wiederholten Aufrufen der Methode ein unerwarteter Laufzeitfehler oder eine Access-Verletzungsausnahme ausgelöst werden Ping.send kann.

Ursprüngliche Produktversion:   Visual Studio 2010
Ursprüngliche KB-Nummer:   2533627

Problembeschreibung

Wenn Sie ein Klassenobjekt wiederholt erstellen und Ping zerstören, kann dies je nach Anwendungskonfiguration oder beim Aufrufen der Methode zu einem unerwarteten Laufzeitfehler wie einer Access-Verletzungsausnahme System.Net.NetworkInformation.Ping.Send führen.

Weitere Informationen zur Ping Klasse finden Sie unter "Ping-Klasse".

Ursache

Wenn eine Anwendung ein Objekt wiederholt erstellt und Ping zerstört, werden einige Objekte, die intern von der Klasse beibehalten Ping werden, als nicht bezeichnetes Objekt erkannt, das dann vom Garbage Collection-Mechanismus zerstört wird. Dies kann abhängig von der Implementierung der Anwendung oder dem Zeitpunkt des Aufrufs der Methode zu einem unerwarteten Laufzeitfehler oder einer Ausnahme von Zugriffsverletzungen Ping.Send führen.

Beispielsweise tritt bei der unten beschriebenen Implementierung wahrscheinlich der Laufzeitfehler auf.

static void Pinger()
{
    while(true)
    {
        System.Net.NetworkInformation.Ping objping = new System.Net.NetworkInformation.Ping();
        System.Net.NetworkInformation.PingReply objPingReply;
        objPingReply = objping.Send('127.0.0.1');
    }
}

Sie können dieses Problem umgehen, indem Sie eine der folgenden Optionen verwenden.

Problemumgehung 1: Verwenden Sie den GC. KeepAlive-Methode

Wird GC.KeepAlive verwendet, um den Garbage Collector anweisen, kein Klassenobjekt zu Ping zerstören.

Dadurch wird verhindert, dass die Ping Klasse und alle Klassenobjekte, die sie intern aufbewahrt, vom Garbage Collector zerstört werden, bis sie GC.KeepAlive vorhanden ist. Daher wird die Ursache des Problems beseitigt, und die Ausnahme der Zugriffsverletzung kann vermieden werden.

static void Pinger()
{
    while(true)
    {
        System.Net.NetworkInformation.Ping objping = new System.Net.NetworkInformation.Ping(); 
        System.Net.NetworkInformation.PingReply objPingReply;
        objPingReply = objping.Send('127.0.0.1');
        GC.KeepAlive(objping);
    }
}

Weitere Informationen zu der GC.KeepAlive Methode finden Sie unter GC. KeepAlive(Object) -Methode.

Problemumgehung 2: Ändern der Implementierung

Ändern Sie die Implementierung so, dass ein Klassenobjekt nicht wiederholt erstellt und zerstört Ping wird. Erstellen Sie dazu ein einzelnes Ping Klassenobjekt außerhalb einer Schleife, und verwenden Sie weiterhin das einzelne Objekt. Dadurch wird verhindert, dass ein Ping Klassenobjekt wiederholt erstellt und zerstört wird.

Schreiben Sie z. B. den Code wie folgt:

static void Pinger()
{
    System.Net.NetworkInformation.Ping objping = new System.Net.NetworkInformation.Ping();
    System.Net.NetworkInformation.PingReply objPingReply;
    while(true)
    {
        objPingReply = objping.Send('127.0.0.1');
    }
}

Problemumgehung 3: Verwenden von .NET Framework 4.0

Dieses Problem tritt nicht bei .NET Framework 4.0 auf. Es wird empfohlen, das Visual Studio 2010-System so zu aktualisieren, dass Sie .NET Framework 4.0 verwenden können.