我的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();
}
}
答案 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线程。