Pregunta

El siguiente código está causando un bloqueo intermitente en una máquina de Vista.

using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
     myPlayer.Play();

Yo altamente sospechoso es este código porque el programa se bloquea mediados de sonido o justo antes del pitido que se juega cada momento.He de nivel superior trampas para todos ThreadExceptions, UnhandledExceptions en mi dominio de la aplicación, y un try-catch alrededor de Application.Run, ninguno de los cuales trampa de este accidente.

Alguna idea?


EDITAR:

El Visor de Eventos tiene la siguiente información:

De la aplicación con errores [xyz].exe, versión 4.0.0.0, el sello de tiempo 0x48ce5a74, del módulo con errores msvcrt.dll versión 7.0.6001.18000, tiempo sello 0x4791a727, código de excepción 0xc0000005, desplazamiento del error 0x00009b30, id del proceso 0%9, de aplicación hora de inicio 0x%10.

Curiosamente, la HRESULT 0xc0000005 tiene el mensaje:

"La lectura o la escritura a una memoria inaccesible ubicación." (STATUS_ACCESS_VIOLATION)

¿Fue útil?

Solución

En realidad, el código anterior (es decir, la nueva SoundPlayer(BEEPPURE)).Play();se bloquea para mí.

En este artículo se explica por qué, y ofrece una alternativa a las SoundPlayer que funciona a la perfección:

http://www.codeproject.com/KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx

Otros consejos

Usted puede utilizar el WinDBG y atrapar todas las excepciones de primera oportunidad.Estoy seguro de que voy a ver algo interesante.Si es así, usted puede utilizar el SOS para limpiar la pila y la publicaremos aquí para que nos ayude a lo largo.

O usted puede utilizar Visual Studio mediante la activación de la trampa de todas las excepciones.Vaya a "Depurar" y luego en "Excepciones" y asegúrese de que la trampa de todo.Ello junto con el cambio que el depurador en modo mixto (administrado y no administrado).

Una vez que usted tiene la traza de la pila, se puede determinar la respuesta.

Un proceso no salir en Windows sin excepción.Es de allí.También, usted puede ser que desee comprobar en la máquina de Registro de Eventos para ver si algo ha demostrado.

El visor de sucesos muestra HRESULT 0xc0000005 "de Lectura o escritura a una memoria inaccesible ubicación." (STATUS_ACCESS_VIOLATION)

Véase mi edición anterior para obtener más detalles;reproing esto lleva un tiempo, así que no puede conseguir un nuevo volcado de WinDBG para un poco mientras que.

La solución es el uso de Microsoft.VisualBasic.Los dispositivos, que no sufren de este error.Ya que es solo para Vista, y el Visor de Eventos incluso se las arregló para fallar a mitad de camino a través del registro de la caída (identificador de proceso 0x**%9** debe tener un valor hexadecimal, eso sí), he de decir que la culpa en el nuevo código de sonido en la Vista.

Por CIERTO, la conexión de la VS depurador para el proceso de bloqueo gestionarlo de forma remota a primera colgar Visual Studio, causa, a continuación, una pantalla azul en mi máquina, mientras que matar a los que no responden devenv.exe.Maravilloso!

Pura especulación, pero el problema puede ser el uso de la instrucción.El código es como esta (creo):

using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{    
    myPlayer.Play();
}

El uso de bloque de llamar a Dispose() de myPlayer, a veces antes de que se realiza la reproducción del sonido (pero rara vez, porque el sonido es tan corto con un sonido más, apuesto que usted puede reproducir el error cada vez).El error sería el resultado de la API de Windows (que SoundPlayer envuelve) tratando de jugar un buffer que ya ha sido eliminado por .NET.

Creo que si haces esto:

SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();

o incluso

(new SoundPlayer(BEEPPURE)).Play();

usted no va a ver el error más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top