2

音楽を聴いたりビデオを見たりするアプリを書いています。アプリには、次の 2 つのページがあります。1 つはオーディオ再生エージェント (APA) を再生するページ A、もう 1 つはビデオを再生するページ (MediaElement を使用) - ページ B です。一方、WP8 には APA に関するバグがあります (ここで尋ねます(私は解決策を見つけました-MediaElementが再生されて閉じるときの前後にAPAを2回停止します)。

問題は、A ページで DispatcherTimer ティックを毎秒使用して APA インスタンスの位置を確認していたことです。このページを離れると、この DispatcherTimer を停止する機能があります。

それでも、ページ A に何度か移動してからページ B に移動すると、1 秒後にアプリが例外をスローしました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;
            }
        }
    }
4

1 に答える 1

0

クラスにIDisposeを実装できます。この実装では、タイマーを停止します。次に、ページを離れるたびに Dispose を呼び出します。Dispose では、次のように記述します。

timer?.Stop();
于 2019-03-27T07:48:16.043 に答える