我正在编写一个应用程序以听音乐和观看视频。在应用程序中,我有两个页面:1个用于播放音频播放代理(APA)-A页,一个用于播放视频(使用MediaElement)-B页。虽然WP8的APA有一个错误(我已经在这里问here (我找到了一个解决方案-在MediaElement播放和关闭之前和之后停止APA两次)。

问题是,在A页面上,我每秒使用一次DispatcherTimer滴答检查APA实例位置,当我离开此页面时,我有一个功能来停止此DispatcherTimer。

即便如此,如果我在A页上导航了几次,然后又在1秒后导航到B页,则应用程序在if (BackgroundAudioPlayer.Instance.PlayerState == ...处引发了异常。这意味着DispatcherTimer仍在打勾我怎么能强制停止这个:(



我在这里发布了与DispatcherTimer相关的所有代码:

public DetailSongPage()
    {
        InitializeComponent();
        this.DataContext = App.Model;
        BackgroundAudioPlayer.Instance.PlayStateChanged += APA_Instance_PlayStateChanged;
    }
DispatcherTimer timer = null;

private void APA_Instance_PlayStateChanged(object sender, EventArgs e)
    {
        if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing)
        {
            UpdateTracking();
        }
    }
protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        base.OnNavigatedTo(e);
        if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing || BackgroundAudioPlayer.Instance.PlayerState == PlayState.Paused)
        {
            UpdateTracking();
        }
    }
protected override void OnNavigatedFrom(NavigationEventArgs e)
    {
        base.OnNavigatedFrom(e);
        timer.Stop();
        timer.Tick -= timer_Tick;
        timer = null;
    }
private void UpdateTracking()
    {
        sldTracking.Maximum = BackgroundAudioPlayer.Instance.Track.Duration.TotalMilliseconds;
        tbMaxTime.Text = string.Format(@"{0:mm\:ss}",BackgroundAudioPlayer.Instance.Track.Duration);
        // ^ these 2 lines update the UI for the slider and textblock

        if (timer == null)
        {
            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(1000);
            timer.Tick += timer_Tick;
            timer.Start();
        }
    }
    private void timer_Tick(object sender, EventArgs e)
    {
        if (this.timer != null)
        {
            try
            {
                if (BackgroundAudioPlayer.Instance.PlayerState == PlayState.Playing || BackgroundAudioPlayer.Instance.PlayerState == PlayState.Paused)
                {
                    sldTracking.Value = BackgroundAudioPlayer.Instance.Position.TotalMilliseconds;
                    tbCurrentTime.Text = string.Format(@"{0:mm\:ss}", BackgroundAudioPlayer.Instance.Position);
                }
            }
            catch
            {
                return;
            }
        }
    }

最佳答案

您可以在您的类中实现IDispose,在此实现中,停止计时器。
然后,无论何时离开页面,都请致电Dispose。
在“处置”中,您应该编写如下内容:

timer?.Stop();

关于c# - DispatcherTimer仍在Stop()之后打勾事件,并将其设置为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26421883/

10-13 01:39