Frage

Der folgende Code verursacht einen intermittierenden Absturz auf einem Vista-Rechner.

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

ich sehr vermute, dass es dieser Code ist, weil das Programm Mitte Piepton abstürzt oder kurz vor dem Signalton jedes Mal gespielt wird. Ich habe Top-Level-Fallen für all ThreadExceptions, UnhandledExceptions in meiner app-Domäne und eine try-catch um Application.Run, von denen keine Falle dieses zum Absturz bringen.

Irgendwelche Ideen?


EDIT:

Die Ereignisanzeige hat folgende Informationen:

  

Fehlgeschlagene Anwendung [xyz] .exe, Version 4.0.0.0, Zeitstempel   0x48ce5a74, fehlgeschlagenes Modul msvcrt.dll, Version 7.0.6001.18000, Zeit   Stempel 0x4791a727, Ausnahmecode 0xc0000005, Offsetfehler 0x00009b30,   Prozess-ID 0x% 9, Anwendungszeit 0x% 10 starten.

Interessanterweise hat die HRESULT 0xc0000005 die Meldung:

  

„Das Lesen oder zu einem unzugänglichen Speicherplatz zu schreiben.“   (STATUS_ACCESS_VIOLATION)

War es hilfreich?

Lösung

Eigentlich ist der obige Code (das heißt, neue Soundplayer (BEEPPURE)) Play (). für mich war abstürzt.

Dieser Artikel erklärt, warum, und stellt eine Alternative zu Soundplayer, die einwandfrei funktioniert:

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

Andere Tipps

Sie können mit WinDBG und Trap alle ersten Chance Ausnahmen. Ich bin sicher, dass Sie etwas Interessantes sehen werden. Wenn ja, können Sie SOS verwenden den Stapel aufzuräumen und es hier zu posten, uns zu helfen entlang.

Oder können Sie Visual Studio verwenden, indem die Falle aller Ausnahmen ermöglicht. Gehen Sie auf „Debug“ und dann auf „Ausnahmen“ und stellen Sie sicher, dass Sie trap alles. Tun Sie dies zusammen mit den Debugger zu Mixed-Mode-Schaltung (verwaltete und nicht verwaltete).

Wenn Sie den Stack-Trace haben, können wir die Antwort bestimmen.

Ein Prozess nicht beendet auf Windows ohne Ausnahme. Es ist da drin. Auch sollten Sie das Maschinenereignisprotokoll zu überprüfen, um zu sehen, ob alles gezeigt hat.

Die Ereignisanzeige zeigt HRESULT 0xc0000005 „Lesen oder zu einem unzugänglichen Speicherplatz zu schreiben.“ (STATUS_ACCESS_VIOLATION)

Sehen Sie meine bearbeiten oben für weitere Details; reproing dies dauert eine Weile, so kann ich ein neues Crash-Dump für WinDBG für eine Weile nicht bekommen.

Die Lösung ist Microsoft.VisualBasic.Devices zu verwenden, die nicht von diesem Fehler leidet. Da es Vista ist nur, und die Ereignisanzeige schaffte es sogar auf halben Weg zum Scheitern verurteilt durch den Absturz Protokollierung (Prozess-ID 0x **% 9 ** sollte es stattdessen einen Hex-Wert hat), verweise ich die Schuld an dem neuen Sound-Code in Vista.

BTW, die VS-Debugger an den Absturz Prozess Remote-Verbindung verwalten ersten Visual Studio hängen, verursacht dann einen BSOD auf meiner Maschine, während den nicht-reaktions devenv.exe zu töten. Wonderful!

Reine Spekulation hier, aber das Problem kann die Anweisung using sein. Der Code ist wie folgt (glaube ich):

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

Die Verwendung von Block Entsorgen Sie rufen wird () auf MyPlayer, manchmal, bevor sie den Ton getan spielt (aber selten, weil der Ton so kurz ist - mit einem längeren Ton, werde ich wette, dass Sie den Fehler reproduzieren kann jedes Mal) . Der Fehler würde das Ergebnis des Windows-API sein (den Soundplayer Wraps) versucht, einen Puffer zu spielen, die bereits von .NET entsorgt wurde.

Ich denke, wenn Sie dies tun:

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

oder auch

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

Sie werden nicht den Fehler sehen mehr.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top