Domanda

Il codice riportato di seguito è causato da un falso incidente su una macchina Vista.

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

Ho il sospetto che sia questo codice, perché il programma si blocca a metà beep o appena prima del segnale acustico viene riprodotto ogni volta.Io sono di livello superiore trappole per tutti ThreadExceptions, UnhandledExceptions nel mio dominio dell'applicazione, e un try-catch intorno Application.Run, e nessuna trappola di questo incidente.

Tutte le idee?


EDIT:

L'Event Viewer ha le seguenti informazioni:

Che ha provocato l'errore applicazione [xyz].exe, versione 4.0.0.0, timbro 0x48ce5a74, che ha provocato l'errore modulo msvcrt.dll versione 7.0.6001.18000, tempo timbro 0x4791a727, codice eccezione 0xc0000005, offset errore 0x00009b30, id processo: 0x%9, applicazione ora inizio: 0x%10.

È interessante notare che, il HRESULT 0xc0000005 è il messaggio:

"La lettura o la scrittura di un inaccessibile posizione di memoria." (STATUS_ACCESS_VIOLATION)

È stato utile?

Soluzione

In realtà, il codice di cui sopra (che è, di nuovo SoundPlayer(BEEPPURE)).Play();andava in crash per me.

Questo articolo spiega perché, e fornisce un'alternativa per SoundPlayer che funziona perfettamente:

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

Altri suggerimenti

È possibile utilizzare WinDBG e intercettare tutte le eccezioni first-chance.Sono sicuro che si vedrà qualcosa di interessante.Se è così, è possibile utilizzare SOS per ripulire lo stack e post qui per aiutarci a lungo.

Oppure è possibile utilizzare Visual Studio, consentendo la trappola di tutte le eccezioni.Vai su "Debug" e poi su "Eccezioni" e assicurarsi di catturare tutto.Questa commutazione il debugger in modalità mista (gestito e non gestito).

Una volta che avete la traccia dello stack, siamo in grado di determinare la risposta.

Un processo non uscire su Windows senza eccezione.C'.Inoltre, si potrebbe voler controllare la macchina del Registro Eventi per vedere se qualcosa è arrivato.

Il visualizzatore eventi mostra HRESULT 0xc0000005 "la Lettura o la scrittura di un inaccessibile posizione di memoria." (STATUS_ACCESS_VIOLATION)

Vedere il mio edit sopra per ulteriori dettagli;reproing questo prende un po 'in modo da non ottenere una nuova dump di arresto anomalo per WinDBG per un po'.

La soluzione è usare Microsoft.VisualBasic.I dispositivi, che non soffre di questo bug.Dal momento che è solo Vista, e il Visualizzatore Eventi è riuscito anche a non riuscire a metà strada attraverso la registrazione del crash (id di processo 0x**%9** dovrebbe avere un valore esadecimale invece è presente), io punto la colpa al nuovo codice suono in Vista.

BTW, collegare il VS debugger per l'arresto del processo gestito in remoto, prima di appendere Visual Studio, quindi causa un BSOD sulla mia macchina mentre uccide il non-reattivo devenv.exe.Meraviglioso!!!

Pura speculazione qui, ma il problema potrebbe essere l'utilizzo di istruzione.Il codice è simile a questo (credo):

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

L'utilizzo di blocchi di chiamare Dispose() nel myPlayer, a volte prima si è fatto la riproduzione del suono (ma molto di rado, perché il suono è così breve, con un lungo suono, scommetto che è possibile riprodurre l'errore ogni volta).L'errore potrebbe essere il risultato delle API di Windows (che SoundPlayer impacchi) cercando di giocare a un buffer che è già stato eliminato da .NET.

Penso che se si esegue questa operazione:

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

o anche

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

non vedere l'errore più.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top