音乐以SoundPlayer结束后做一些事情

时间:2015-12-03 18:54:04

标签: c# audio soundplayer

我的Async Loaded音乐文件完成后我需要做点什么。假设我希望程序退出或者其他东西。现在我怎么做才能完成音乐?

有什么想法吗?

这是我现在的代码:

    private void button1_Click(object sender, EventArgs e)
    {
        player.SoundLocation = @"Music\" + FileList[0];
        player.LoadAsync();
    }

    private void Player_LoadCompleted(object sender, AsyncCompletedEventArgs e)
    {
        if (player.IsLoadCompleted)
        {
            player.PlaySync();
        }
    }

2 个答案:

答案 0 :(得分:2)

由于PlaySync方法是同步的,因此在文件播放到最后之前它不会返回。所以,你可以这样做:

if (player.IsLoadCompleted)
{
    player.PlaySync();
    DoSomethingAfterMusicIsDone();
}

<强>更新

如果LoadAsync指向文件系统上的文件,

SoundLocation似乎同步运行。这意味着如果您不想冻结UI线程,则应在另一个线程上调用LoadAsync。这是一个例子:

Task.Run(() => player.LoadAsync());

答案 1 :(得分:0)

改为使用MediaPlayer:

mediaPlayer = new MediaPlayer();
mediaPlayer.MediaEnded += delegate { MessageBox.Show("Media Ended"); };
mediaPlayer.Open(new Uri(@"C:\myfile.mp3"));
mediaPlayer.Play();

理论上听起来不错。然而,事实上,我无法启动MediaEnded Event。因此,我必须按如下方式轮询MediaEvent的结尾:

while(true)
{
    System.Threading.Thread.Sleep(1000);
    string pos = "unknown";
    string dur = "unknown";

    try 
    {
        pos = mediaplayer1.Position.Ticks.ToString();
        dur = mediaplayer1.NaturalDurataion.TimeSpan.Ticks.ToString()
        if (pos == dur)
        {
            // MediaEnded!!!!!
            pos = "0";
            dur = "0";
        }
        catch {}
    }
}

从积极的方面来说,您可以通过投票更新您的音频播放器滑块... 在缺点方面,如果你注意到1000毫秒滞后,它会使暂停按钮反应迟钝......

如果您使用此解决方法,我建议将Mediaplayer放在后台线程中,以便轮询循环不会锁定UI线程。