我正在使用SoundPlayer
类在我的WPF应用程序中播放WAV文件。这些文件很短并且是应用程序的一部分,并且响应程序中发生的事件而播放。用户无法控制播放什么声音,也不能决定自己播放声音。我也尝试使用WPF MediaPlayer
控件,但是我遇到了该控件的问题。 SoundPlayer
工作得很好,但有一个问题。SoundPlayer的替代品
本质上,我需要保持一个声音的队列,并在他们排队时一个接一个地播放声音。在某些情况下,我必须停止正在播放的声音,然后播放另一个声音。所以我有两个要求,这与SoundPlayer
控件相互排斥:
- 我的代码需要知道声音何时播放完毕。
- 的声音在后台
为了实现这个玩,我创建了一个名为SoundController
类。这有一个后台线程,它使用Thread
的Dispatcher
将呼叫排队到我用来播放声音的方法,使用BeginInvoke
。该方法在SoundController
事件中引发一个事件,然后它将SoundPlayer.PlaySync
播放声音,然后在PlaySync
返回后引发另一个事件。
在我的UI线程中,在需要停止声音的位置,我调用SoundController
类的Stop
方法。这叫SoundPlayer
的Stop
方法停止播放声音。这就是问题发生的地方。事实证明,SoundPlayer.Stop
不会停止声音,但它会在返回之前等待声音完成。
这会阻止我的GUI死机。虽然我可以异步调用它,但我的GUI不会停止,但声音也不会停止。
正如我所说,WPF MediaPlayer没有为我们工作,无论如何它是矫枉过正。有没有其他的替代方法可以播放声音,让我能够引发事件,在后台线程中播放声音,并停止播放?
编辑06/26/2012:
这一直在这里进行了一个多月,我已经变得没有任何反应。所以我猜想SoundPlayer
控制没有其他替代方案。
我打算从另一个角度发布一个新问题。
我正好碰上了WinForms应用程序,而不是WPF这种精确的问题,但我怀疑在这种情况下的事项。我有点不清楚为什么/如何添加第二个工作线程会在这里有所作为(或者'.stop()'可以跨线程工作,或者它不确定?为什么*哪个*线程是重要的?)我将在明天或周一回来试图围绕它回顾一下,但如果你有时间/动机来详细说明这个问题并且/或者把它放到骨架代码中,我会非常感激:-) – DaveRandom
问题是调用'Play'方法的线程不能自行中断,因为它正忙于播放声音。在完成播放声音之前,它不可能执行到“停止”的呼叫,此时已经太晚了。阻止正在播放中的声音的唯一方法是从另一个线程调用“Stop”。这就是为什么我添加了一个单独的线程,致力于除了播放声音外什么也不做。我将编辑我的答案并添加一些骨架代码。 –
非常感谢本次更新,我要去有一个玩它在早晨 – DaveRandom