Я пытаюсь написать замену для System.Media.SoundPlayer
с использованием waveOut...
API. Этот API выполняет обратный вызов метода в моей версии SoundPlayer, когда переданный файл / поток завершил воспроизведение.
Если я создаю экземпляр своего SoundPlayer в области формы и что-то играю, все работает нормально, потому что форма поддерживает живой объект, поэтому делегат жив, чтобы получить обратный вызов.
Если я использую это, например, в случае нажатия кнопки:
SoundPlayer player = new SoundPlayer(@"C:\whatever.wav");
player.Play();
... он работает нормально в 99% случаев, но иногда (и часто, если файл длинный) объект SoundPlayer собирается сборщиком мусора до его завершения, поэтому делегат больше не может принимать обратный вызов, и я получаю ужасную ошибку.
Я знаю, как «закреплять» объекты, используя GCHandle.Alloc
, но только когда что-то еще может висеть на ручке. Есть ли какой-нибудь способ для объекта закрепить себя внутри, а затем открепить себя после определенного периода времени (или завершения воспроизведения)? Если я попытаюсь GCHandle.Alloc (this, GCHandleType.Pinned);
, я получу исключение во время выполнения «Объект содержит не примитивные или неблизкие данные».