我正在尝试按此顺序执行3项操作:
MediaPlayer
播放一些音轨MessageBox
(用户可以随时关闭)E.g:
private void DoTheseThings()
{
// start playing audio first
PlaySongs();
// then show message box
MessageBox.Show("The audio has started");
}
private void PlaySongs()
{
Dispatcher.BeginInvoke(() =>
{
foreach (var song in songs)
{
Thread.Sleep(delay);
FrameworkDispatcher.Update();
MediaPlayer.Play(song);
}
});
}
// stop playing audio when the screen is tapped
private override void OnTap(System.Windows.Input.GestureEventArgs e)
{
Dispatcher.BeginInvoke(() =>
{
MediaPlayer.Stop();
});
}
问题是在音频开始之前弹出MessageBox
,直到我在MessageBox
上单击“确定”才会播放任何内容。音频应该在MessageBox
之前开始!
然后当我点击屏幕时,没有任何事情发生,直到完成所有音频播放。当音频全部完成时,如果我点击屏幕3次,OnTap
会发射3次,但此时已经很晚了。
我需要做些什么才能以正确的顺序让这些事情发生,让OnTap
事件响应并在需要时停止MediaPlayer?
答案 0 :(得分:0)
那是因为你使用调度程序而不是直接启动歌曲 - 一旦没有别的事情要做,匿名方法就会安排在UI线程上运行,但在此之前会显示MessageBox。 MessageBox也是模态的,因此在关闭MessageBox窗口之前,歌曲的预定开始将不会开始 在歌曲开始后尝试将MessageBox添加到匿名方法。另外,为什么你还需要使用调度员来开始/停止歌曲?