首页 > 解决方案 > 音乐突然停止在 C# Windows 窗体应用程序中播放

问题描述

在我的应用程序中,通常应该有 2 个重叠的声音(一首歌和一些短的声音)。它工作正常,直到有时歌曲突然停止播放。你知道我该如何解决这个问题吗?以下是我用于添加歌曲和声音的功能:

private void musical()
{
    var p1 = new System.Windows.Media.MediaPlayer();
    p1.Open(new System.Uri(@"J:\penalty\penalty\penalty\bin\Debug\Avicii - The Nights (Lyrics HD).wav"));
    p1.Play();     
}
private void happy()
{
    System.Threading.Thread.Sleep(500);

    var p2 = new System.Windows.Media.MediaPlayer();
    p2.Open(new System.Uri(@"J:\penalty\penalty\penalty\bin\Debug\happy.wav"));
    p2.Play();
}
private void sad()
{
    System.Threading.Thread.Sleep(500);

    var p2 = new System.Windows.Media.MediaPlayer();
    p2.Open(new System.Uri(@"J:\penalty\penalty\penalty\bin\Debug\sad.wav"));
    p2.Play();
}

标签: c#.netwinformsmedia

解决方案


如果您不将MediaPlayers 的引用存储为字段,而仅存储在局部变量中,则它们可能会被 gargabe 收集。这可能会延迟发生,因为MediaPlayer使用需要Dispose释放之前的非托管资源。要解决您的问题,请考虑MediaPlayer在字段中存储对 s 的引用。

private System.Windows.Media.MediaPlayer _music;
private System.Windows.Media.MediaPlayer _happy;
private System.Windows.Media.MediaPlayer _sad;

然后调整您的方法以改用该字段。

private void musical()
{
    _music = new System.Windows.Media.MediaPlayer();
    _music.Open(new System.Uri(@"J:\penalty\penalty\penalty\bin\Debug\Avicii - The Nights (Lyrics HD).wav"));
    _music.Play();     
}

如果您想重复播放音频(效果不太好),您可以订阅该MediaEnded事件,以便将位置设置回开头并重新开始播放。


推荐阅读