【发布时间】:2010-11-12 18:31:16
【问题描述】:
这是一个看似简单的问题:
在 Windows 窗体中异步播放嵌入式 .wav 资源文件的正确方法是什么?
尝试 #1:
var player = new SoundPlayer();
player.Stream = Resources.ResourceManager.GetStream("mySound");
player.Play(); // Note that Play is asynchronous
- 好:不会阻塞 UI 线程
- 错误:SoundPlayer 和嵌入式 资源流不会立即 弃置。
尝试 #2:
using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
using (var player = new SoundPlayer(audioMemory))
{
player.Play();
}
}
- 很好:UI 线程没有被阻塞,SoundPlayer 和音频内存流立即被释放。
- 错误:比赛条件! Play() 是异步的,如果音频内存在 Play 完成之前被释放......繁荣!抛出运行时异常。
尝试 #3:
using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
using (var player = new SoundPlayer(audioMemory))
{
player.PlaySync();
}
}
- 很好:立即释放播放器和音频流。
- 错误:PlaySync 阻塞了 UI 线程
尝试 #4:
ThreadPool.QueueUserWorkItem(ignoredState =>
{
using (var audioMemory = Resources.ResourceManager.GetStream("mySound"))
{
using (var player = new SoundPlayer(audioMemory))
{
player.PlaySync();
}
}
});
- 很好:UI 没有冻结,播放器和内存流立即被释放。
- 不好:因为这经常触发,我们可能会用完线程池线程!请参阅 Larry Osterman 的 what's wrong with this code part 26。
SoundPlayer 似乎应该有一个 PlayAsyncCompleted 事件。不幸的是,不存在这样的事件。我错过了什么吗?在 Windows 窗体中异步播放 .wav 嵌入资源的正确方法是什么?
【问题讨论】: