acidente SoundPlayer no Vista
-
01-07-2019 - |
Pergunta
O código a seguir está causando um acidente intermitente em uma máquina Vista.
using (SoundPlayer myPlayer = new SoundPlayer(Properties.Resources.BEEPPURE))
myPlayer.Play();
Eu altamente suspeito que é este código porque o programa trava meados de beep ou imediatamente antes do sinal sonoro é jogado cada vez. Tenho armadilhas de nível superior para todos ThreadExceptions
, UnhandledExceptions
no meu domínio de aplicativo, e uma try-catch
torno Application.Run
, nenhum dos quais armadilha deste acidente.
Todas as idéias?
EDIT:
O Visualizador de eventos tem as seguintes informações:
Falha de aplicativo [xyz] .exe, versão 4.0.0.0, carimbo de tempo 0x48ce5a74, falha módulo msvcrt.dll, versão 7.0.6001.18000, o tempo selo 0x4791a727, código de exceção 0xc0000005, falha compensar 0x00009b30, ID do processo 0x% 9, aplicativo hora de início 0 x% 10.
Curiosamente, o HRESULT 0xc0000005
tem a mensagem:
"leitura ou escrita para um local de memória inacessível." (STATUS_ACCESS_VIOLATION)
Solução
Na verdade, o código acima (isto é, novo SoundPlayer (BEEPPURE)) Play (); foi caindo para mim.
Este artigo explica por que, e fornece uma alternativa para SoundPlayer que funciona perfeitamente:
http://www.codeproject.com /KB/audio-video/soundplayerbug.aspx?msg=2862832#xx2862832xx
Outras dicas
Você pode usar WinDBG e prender todas as exceções de primeira chance. Tenho certeza que você vai ver algo interessante. Se assim for, você pode usar SOS para limpar a pilha e postá-lo aqui para nos ajudar junto.
Ou você pode usar Visual Studio, permitindo que a armadilha de todas as exceções. Ir para "Debug" e depois "Exceções" e certifique-se de armadilha tudo. Faça isso junto com a mudança que o depurador de modo misto (gerenciados e não gerenciados).
Assim que tiver o rastreamento de pilha, podemos determinar a resposta.
Um processo não sair no Windows sem uma exceção. É lá dentro. Além disso, você pode querer verificar log de eventos da máquina para ver se alguma coisa tem mostrado-se.
Os shows espectador evento hresult 0xc0000005 "leitura ou escrita para um local de memória inacessível." (STATUS_ACCESS_VIOLATION)
Veja a minha edição acima para mais detalhes; reproing isso leva um tempo para que eu não posso obter um despejo de memória fresca para WinDBG por pouco tempo.
A solução é Microsoft.VisualBasic.Devices de uso, que não sofrem deste bug. Uma vez que apenas a sua Vista, eo Visualizador de eventos ainda conseguiu falhar no meio registrando o acidente (id processo 0x **% 9 ** deve ter um valor hexadecimal lá em vez), eu apontar a culpa no novo código de som em Vista.
BTW, conectando o depurador VS para o processo de bater gerenciados remotamente a primeira pendurar Visual Studio, em seguida, causa um BSOD na minha máquina, enquanto matando o devenv.exe não-responsivos. Maravilhoso!
Pura especulação aqui, mas o problema pode ser a instrução usando. Seu código é assim (eu acho):
using (SoundPlayer myPlayer = new SoundPlayer(BEEPPURE))
{
myPlayer.Play();
}
O bloco usando irá chamar Dispose () no myPlayer, às vezes antes de ser feito jogando o som (mas raramente, porque o som é tão curta - com um som mais longo, eu aposto que você pode reproduzir o erro de cada vez) . O erro seria o resultado da API do Windows (que SoundPlayer embrulha) tentando jogar um buffer que já foi descartado pela NET.
Eu acho que se você fizer isso:
SoundPlayer myPlayer = new SoundPlayer(BEEPPURE);
myPlayer.Play();
ou mesmo
(new SoundPlayer(BEEPPURE)).Play();
Você não verá o erro mais.