使用SoundPlayer循环播放音频时程序崩溃,求排查问题
嘿,我帮你找到问题的症结了!
问题根源
你写的代码里有个很容易忽略的细节:playAudio()方法里的SoundPlayer是局部变量。当这个方法执行完之后,.NET的垃圾回收器(GC)会把这个局部对象标记为可回收,很快就会清理掉它。
但PlayLooping()是异步执行的——它在后台播放音频,方法本身会立刻返回。当第一次播放结束,系统准备触发循环播放时,原来的SoundPlayer实例已经被GC回收消失了,这自然就导致程序崩溃了。
修复方案
把SoundPlayer改成类的成员变量,让它的生命周期和你的窗体/控件保持一致,这样GC就不会在播放中途把它回收掉。
修改后的代码如下:
// 在你的窗体类里声明成员变量(放在方法外面) private SoundPlayer _audioPlayer; private void audio_Load(object sender, EventArgs e) { playAudio(); } private void playAudio() { // 初始化成员变量,而非局部变量 _audioPlayer = new SoundPlayer(Properties.Resources.music); _audioPlayer.PlayLooping(); }
额外小贴士
- 如果你需要停止播放,记得调用
_audioPlayer.Stop();在窗体关闭的时候,最好调用_audioPlayer.Dispose()来释放相关资源,避免内存泄漏。 - 另外提一句:
Properties.Resources.music每次访问都会生成一个新的流实例,如果你有多次初始化的场景,可以提前把流缓存起来,但在这个循环播放的需求里,上面的修改已经足够解决崩溃问题啦。
内容的提问来源于stack exchange,提问作者AlpakaJoe
相关产品推荐
相关产品推荐

