进程没有按照我执行它们的顺序执行,并且设备没有响应Windows Phone上的Tap事件。怎么解决?

时间:2013-11-22 14:34:04

标签: c# windows-phone-8 windows-phone

我正在尝试按此顺序执行3项操作:

  1. 开始MediaPlayer播放一些音轨
  2. 播放音频时显示MessageBox(用户可以随时关闭)
  3. 点按屏幕以停止媒体播放器。 (在消息框关闭后)
  4. 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?

1 个答案:

答案 0 :(得分:0)

那是因为你使用调度程序而不是直接启动歌曲 - 一旦没有别的事情要做,匿名方法就会安排在UI线程上运行,但在此之前会显示MessageBox。 MessageBox也是模态的,因此在关闭MessageBox窗口之前,歌曲的预定开始将不会开始 在歌曲开始后尝试将MessageBox添加到匿名方法。另外,为什么你还需要使用调度员来开始/停止歌曲?