Я создаю игру для Windows в XNA, используя Visual C # Express.В игре есть шесть объектов SoundEffect, для которых регулярно вызываются методы Play ().Проблема в том, что иногда, когда игра закрывается, она падает. Похоже, это происходит всякий раз, когда окно закрывается во время воспроизведения звукового эффекта. Это сообщение, которое появляется в Visual C #:
AccessViolationException не обрабатывалось
Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.
В Visual Studio нет доступных источников для отладки, и когда нажимается «получить общую справку по этому исключению», появляется пустая страницаup ..
Используемый код очень похож на пример MSDN.Это похоже на проблему, которая существует где-то в базовой структуре, а не на мой код.Но, конечно, я не знаю наверняка.Это случалось много раз.
http://msdn.microsoft.com/en-us/library/bb195053.aspx
Вот полная информация об исключении:
System.AccessViolationException was unhandled
Message=Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
Source=Microsoft.Xna.Framework
StackTrace:
at Microsoft.Xna.Framework.Audio.AudioCallbackDispatcher.IsEventRegistered(EventType type)
at Microsoft.Xna.Framework.Audio.AudioCallbackDispatcher.UnregisterEvent(EventType type)
at Microsoft.Xna.Framework.Audio.KernelMicrophone.ShutdownCaptureEngine()
at Microsoft.Xna.Framework.Audio.MicrophoneUnsafeNativeMethods.ShutdownCaptureEngine()
at Microsoft.Xna.Framework.Audio.AudioRendererShutdownHandler.AppExitingEventHandler(Object sender, EventArgs args)
InnerException:
(у меня также играет музыка через MediaPlayer, но я не думаю, что этосвязанный.)
РЕДАКТИРОВАТЬ: Кажется, я нашел что-то, что работает, но это вроде хакерской и действительно не должно быть необходимости.Я все еще открыт для любых более изящных решений.
Вызовите эту строку в Game1.UnloadContent ().Он будет убедиться (если ваши звуковые эффекты короче 3 секунд), что звук не воспроизводится, когда программа действительно закрывается.
System.Threading.Thread.Sleep(3000);