La excepción de infracción de acceso puede producirse cuando se llama al método Ping.send repetidamente
En este artículo se proporciona información sobre cómo resolver un problema en el que se puede producir un error inesperado en tiempo de ejecución o una excepción de infracción de acceso cuando se llama Ping.send al método repetidamente.
Versión del producto original: Visual Studio 2010
Número KB original: 2533627
Síntomas
Al crear y destruir un objeto de clase repetidamente, esto puede provocar un error inesperado en tiempo de ejecución, como la excepción de infracción de acceso según la configuración de la aplicación o cuando se llama Ping al System.Net.NetworkInformation.Ping.Send método.
Para obtener más información acerca de Ping la clase, vea Ping Class.
Causa
Cuando una aplicación crea y destruye un objeto repetidamente, algunos objetos que la clase retiene internamente se reconocen como un objeto no referido, que luego se destruye mediante el mecanismo de recolección de elementos no Ping Ping utilizados. Esto puede provocar un error inesperado en tiempo de ejecución o una excepción de infracción de acceso según la implementación de la aplicación o el tiempo del Ping.Send método al que se llama.
Por ejemplo, con la implementación que se describe a continuación, es probable que se produzca el error en tiempo de ejecución.
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');
}
}
Puede solucionar este problema mediante cualquiera de las siguientes opciones.
Solución alternativa 1: Usar el GC. KeepAlive (método)
Se GC.KeepAlive usa para decirle al recolector de elementos no utilizados que no destruya un objeto de Ping clase.
Esto impide que el recolector de elementos no utilizados destruya la clase y los objetos de clase que retiene Ping internamente hasta GC.KeepAlive que exista. Como resultado, se elimina la causa del problema y se puede evitar la excepción de infracción de acceso.
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);
}
}
Para obtener más información sobre el GC.KeepAlive método, vea GC. KeepAlive(Object) (método).
Solución alternativa 2: Cambiar la implementación
Cambie la implementación para que no cree y destruya un objeto Ping de clase repetidamente. Para ello, cree un único objeto Ping de clase fuera de un bucle y siga usando el único objeto. Esto evita que Ping un objeto de clase se cree y destruya repetidamente.
Por ejemplo, escriba el código como se indica a continuación:
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');
}
}
Solución alternativa 3: Usar .NET Framework 4.0
Este problema no se produce con .NET Framework 4.0. Se recomienda actualizar el Visual Studio 2010 para que pueda usar .NET Framework 4.0.