Question

Le code suivant provoque un blocage intermittent sur un ordinateur Vista.

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

Je soupçonne fortement que c'est ce code parce que le programme se bloque au milieu du bip ou juste avant que le bip ne soit joué à chaque fois. J'ai des interruptions de niveau supérieur pour toutes les ThreadExceptions , UnhandledExceptions dans mon domaine d'application et un try-catch autour de Application.Run , aucun d'entre eux ne piège ce crash.

Des idées?

EDIT:

L'observateur d'événements contient les informations suivantes:

  

Application défaillante [xyz] .exe, version 4.0.0.0, horodatage   0x48ce5a74, module msvcrt.dll défaillant, version 7.0.6001.18000, heure   tampon 0x4791a727, code d'exception 0xc0000005, décalage d'erreur 0x00009b30,   identificateur de processus 0x% 9, heure de début de l'application 0x% 10.

Fait intéressant, le HRESULT 0xc0000005 a le message suivant:

  

"Lecture ou écriture dans un emplacement mémoire inaccessible".   (STATUS_ACCESS_VIOLATION)

Était-ce utile?

La solution

En fait, le code ci-dessus (c’est-à-dire le nouveau SoundPlayer (BEEPPURE)). Play (); se brisait pour moi.

Cet article explique pourquoi et offre une alternative à SoundPlayer qui fonctionne parfaitement:

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

Autres conseils

Vous pouvez utiliser WinDBG et intercepter toutes les exceptions de la première chance. Je suis sûr que vous verrez quelque chose d'intéressant. Si tel est le cas, vous pouvez utiliser SOS pour nettoyer la pile et la poster ici pour nous aider.

Vous pouvez également utiliser Visual Studio en activant l'interruption de toutes les exceptions. Accédez à " Débogage " puis "Exceptions". et assurez-vous de tout piéger. Faites-le en basculant le débogueur en mode mixte (géré et non géré).

Une fois que vous avez la trace de la pile, nous pouvons déterminer la réponse.

Un processus ne se ferme pas sous Windows sans exception. C'est dedans là. Vous pouvez également consulter le journal des événements de la machine pour voir si quelque chose a été affiché.

L'afficheur d'événements affiche HRESULT 0xc0000005 "Lecture ou écriture dans un emplacement de mémoire inaccessible". (STATUS_ACCESS_VIOLATION)

Voir mon édition ci-dessus pour plus de détails; Cela prend un certain temps, donc je ne peux pas obtenir un nouveau vidage sur incident pour WinDBG pendant un moment.

La solution consiste à utiliser Microsoft.VisualBasic.Devices, qui ne souffre pas de ce bogue. Comme il s’agit uniquement de Vista et que l’Observateur d’événements a même échoué en enregistrant l’incident à mi-chemin (le processus id 0x ** **% 9 ** devrait avoir une valeur hexadécimale à la place), je blâme le nouveau code audio dans Vista.

BTW, la connexion du débogueur de VS au processus de blocage à distance a réussi à bloquer tout d'abord Visual Studio, puis à créer un BSOD sur ma machine tout en détruisant le devenv.exe non réactif. Merveilleux!

Pure spéculation ici, mais le problème peut être la déclaration using. Votre code est comme ça (je pense):

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

Le bloc using appellera Dispose () sur myPlayer, parfois avant que le son soit joué (mais rarement, car le son est si court - avec un son plus long, je parie que vous pouvez reproduire l'erreur à chaque fois) . L’erreur serait le résultat de l’API Windows (enveloppée par SoundPlayer) qui tenterait de lire un tampon déjà supprimé par .NET.

Je pense que si vous faites ceci:

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

ou même

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

vous ne verrez plus l'erreur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top