Вопрос

Следующий код вызывает периодический сбой на компьютере с Vista.

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

Я сильно подозреваю, что это именно этот код, потому что программа выходит из строя в середине звукового сигнала или непосредственно перед воспроизведением звукового сигнала каждый раз.У меня есть ловушки высшего уровня для всех ThreadExceptions, UnhandledExceptions в домене моего приложения и try-catch вокруг Application.Run, ни один из которых не приводит к этому сбою.

Есть какие-нибудь идеи?


Редактировать:

Средство просмотра событий содержит следующую информацию:

Приложение с ошибкой [xyz].exe, версия 4.0.0.0, отметка времени 0x48ce5a74, модуль обнаружения неисправности msvcrt.dll, версия 7.0.6001.18000, отметка времени 0x4791a727, код исключения 0xc0000005, смещение ошибки 0x00009b30, идентификатор процесса 0x% 9, время запуска приложения 0x%10.

Интересно, что HRESULT 0xc0000005 содержит сообщение:

"Чтение или запись в недоступную ячейку памяти". (STATUS_ACCESS_VIOLATION)

Это было полезно?

Решение

Собственно, приведенный выше код (то есть новый SoundPlayer(BEEPPURE)).Play();для меня это был крах.

В этой статье объясняется, почему, и предлагается альтернатива SoundPlayer, которая работает безупречно:

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

Другие советы

Вы можете использовать WinDbg и перехватывать все исключения первого шанса.Я уверен, вы увидите что-нибудь интересное.Если это так, вы можете использовать SOS для очистки стека и опубликовать его здесь, чтобы помочь нам в этом.

Или вы можете использовать Visual Studio, включив блокировку всех исключений.Перейдите в раздел "Отладка", а затем в раздел "Исключения" и убедитесь, что вы перехватили все.Сделайте это одновременно с переключением отладчика в смешанный режим (управляемый и неуправляемый).

Как только у вас будет трассировка стека, мы сможем определить ответ.

Процесс не завершается в Windows без исключения.Это там, внутри.Кроме того, вы можете захотеть проверить журнал событий компьютера, чтобы узнать, появилось ли что-нибудь.

Средство просмотра событий показывает результат 0xc0000005 "Чтение или запись в недоступную ячейку памяти". (STATUS_ACCESS_VIOLATION)

Смотрите мою правку выше для получения более подробной информации;повторная проверка этого занимает некоторое время, поэтому я некоторое время не могу получить свежий аварийный дамп для WinDbg.

Решение заключается в использовании Microsoft.VisualBasic.Devices, который не страдает от этой ошибки.Поскольку это только Vista, и средству просмотра событий даже удалось выйти из строя на полпути при регистрации сбоя (идентификатор процесса 0x **% 9 ** вместо этого должен иметь шестнадцатеричное значение), я указываю вину на новый звуковой код в Vista.

Кстати, удаленному подключению отладчика VS к аварийному процессу удалось сначала зависнуть Visual Studio, а затем вызвать BSOD на моем компьютере, отключив не отвечающий на запросы devenv.exe.Замечательно!

Здесь чистая спекуляция, но проблема может заключаться в инструкции using.Ваш код выглядит примерно так (я думаю):

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

Блок using вызовет Dispose() в MyPLAYER, иногда до завершения воспроизведения звука (но редко, потому что звук очень короткий - бьюсь об заклад, что при более длинном звуке вы сможете воспроизводить ошибку каждый раз).Ошибка может быть результатом того, что Windows API (который обертывает SoundPlayer) пытается воспроизвести буфер, который уже был удален .NET.

Я думаю, что если ты сделаешь это:

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

или даже

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

вы больше не увидите ошибку.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top