2

在我的异步加载音乐文件完成后,我需要做一些事情。假设我希望程序退出或其他什么。现在音乐结束后我该怎么做?

    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();
        }
    }
4

2 回答 2

2

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

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

更新:

LoadAsyncSoundLocation如果指向文件系统上的文件,则似乎同步运行。这意味着LoadAsync如果您不想冻结 UI 线程,您应该在另一个线程上调用。这是一个例子:

Task.Run(() => player.LoadAsync());
于 2015-12-03T19:25:55.210 回答
0

改用 MediaPlayer:

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

理论上听起来不错。然而,事实上,我无法触发 MediaEnded 事件。因此,我必须按如下方式轮询 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 线程。

于 2017-08-24T13:48:41.380 回答