You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:32:06