Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Dispatchermer在Stop()之后仍会勾选事件并设置为null_C#_Windows Phone 8_Dispatchertimer_Audio Playback Agent - Fatal编程技术网

C# Dispatchermer在Stop()之后仍会勾选事件并设置为null

C# Dispatchermer在Stop()之后仍会勾选事件并设置为null,c#,windows-phone-8,dispatchertimer,audio-playback-agent,C#,Windows Phone 8,Dispatchertimer,Audio Playback Agent,我正在写一个应用程序来听音乐和看视频。在应用程序中,我有两个页面:一个是播放音频播放代理(APA)-页面A,另一个是播放视频(使用MediaElement)-页面B。而WP8在APA上有一个bug(我在这里问过这个问题(我找到了一个解决方案-在MediaElement播放和关闭之前停止APA两次) 问题是,在A页面上,我每秒使用一个Dispatchermer勾选来检查APA实例的位置,当我离开这个页面时,我有一个功能来停止这个Dispatchermer 即便如此,如果我在A页来回浏览了几次,然后

我正在写一个应用程序来听音乐和看视频。在应用程序中,我有两个页面:一个是播放音频播放代理(APA)-页面A,另一个是播放视频(使用MediaElement)-页面B。而WP8在APA上有一个bug(我在这里问过这个问题(我找到了一个解决方案-在MediaElement播放和关闭之前停止APA两次)

问题是,在A页面上,我每秒使用一个Dispatchermer勾选来检查APA实例的位置,当我离开这个页面时,我有一个功能来停止这个Dispatchermer

即便如此,如果我在A页来回浏览了几次,然后又浏览到B页,1秒钟后,应用程序在
if(BackgroundAudioPlayer.Instance.PlayerState==…
)上抛出了一个异常。这意味着Dispatcher仍在滴答作响?我如何才能强制停止此操作:(


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

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。 在Dispose中,您应该编写如下内容:

timer?.Stop();

你能把你的调度员的声明也包括进来吗?@Rajeevbatia我已经发布了我的代码。给我们看看调用堆栈。