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)

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top