Здесь обманчиво простой вопрос:
Каков правильный способ асинхронного воспроизведения встроенного файла ресурсов .wav в Windows Forms?
Попытка # 1:
var player = new SoundPlayer();
player.Stream = Resources.ResourceManager.GetStream("mySound");
player.Play(); // Note that Play is asynchronous
- Хорошо: не блокирует поток пользовательского интерфейса.
- Плохо: SoundPlayer и встроенный поток ресурсов не сразу расположены.
Попытка № 2:
using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
using (var player = new SoundPlayer(audioMemory))
{
player.Play();
}
}
- Хорошо: поток пользовательского интерфейса не заблокирован, звук SoundPlayer и поток звуковой памяти немедленно удаляются.
- Плохо: состояние гонки! Play() - это асинхронный режим, и если звуковая память удаляется до того, как воспроизведение будет выполнено... бум! Исключено исключение времени выполнения.
Попытка № 3:
using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
using (var player = new SoundPlayer(audioMemory))
{
player.PlaySync();
}
}
- Хорошо: проигрыватель и аудиопоток немедленно удаляются.
- Плохо: PlaySync блокирует поток пользовательского интерфейса.
Попытка # 4:
ThreadPool.QueueUserWorkItem(ignoredState =>
{
using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
using (var player = new SoundPlayer(audioMemory))
{
player.PlaySync();
}
}
});
- Хорошо: пользовательский интерфейс не замерзает, проигрыватель и поток памяти немедленно удаляются.
- Плохо: потому что это часто срабатывает, у нас могут закончиться потоки пула потоков! См. Larry Osterman что не так с этой частью кода 26.
Кажется, что SoundPlayer должен иметь событие PlayAsyncCompleted. К сожалению, такого события нет. Я что-то упускаю? Каков правильный способ асинхронного воспроизведения встроенного ресурса .wav в Windows Forms?