2016-05-29 14 views
1

私は、BackgroundAudioTaskを使用してUWPアプリケーションを作成しています。私のアプリはとてもうまくいっています。今度は、再生されたオーディオの現在の位置をTextBlockに追加します。BackgroundPoolTimerをバックグラウンドオーディオで使用するUWP

私は、オーディオタスクを実装する前に、このメソッドをしていた。

private TimeSpan TotalTime; 
     private DispatcherTimer timerRadioTime; 

     private void radioPlayer_MediaOpened(object sender, RoutedEventArgs e) 
     { 
      TotalTime = radioPlayer.NaturalDuration.TimeSpan; 

      // Create a timer that will update the counters and the time slider 
      timerRadioTime = new DispatcherTimer(); 
      timerRadioTime.Interval = TimeSpan.FromSeconds(1); 
      timerRadioTime.Tick += TimerRadioTime_Tick; 
      timerRadioTime.Start(); 
     } 

     private void TimerRadioTime_Tick(object sender, object e) 
     { 
      //Check if the audio finished calculate it's total time 
      if (radioPlayer.NaturalDuration.TimeSpan.TotalSeconds > 0) 
      { 
       if (TotalTime.TotalSeconds > 0) 
       { 
        // Updating timer 
        TimeSpan currentPos = radioPlayer.Position; 
        var currentTime = string.Format("{0:00}:{1:00}", (currentPos.Hours * 60) + currentPos.Minutes, currentPos.Seconds); 
        radioTimerBlock.Text = currentTime; 
       } 
      } 
     } 

私はそれは私に例外を与えたバックグラウンドタスクを実装した場合。調査した後、私はdispatcherTimerの代わりにThreadPoolTimerを使うことを提案しました。

ThreadPoolTimer timer; 

     // for displaying time only 
     private void CurrentPlayer_MediaOpened(MediaPlayer sender, object args) 
     { 
      _clockTimer_Tick(timer); 
     } 


     private async void _clockTimer_Tick(ThreadPoolTimer timer) 
     { 
      var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher; 
      await dispatcher.RunAsync(
      CoreDispatcherPriority.Normal,() => 
      { 

       // Your UI update code goes here! 
       if (CurrentPlayer.NaturalDuration.TotalSeconds > 0) 
       { 
        TimeSpan currentPos = CurrentPlayer.Position; 
        var currentTime = string.Format("{0:00}:{1:00}", (currentPos.Hours * 60) + currentPos.Minutes, currentPos.Seconds); 
        CurrentPosition.Text = currentTime; 
       } 

      }); 
     } 

これは明らかに動作していない:

は、私が( Clock program employing ThreadPoolTimer C# uwpこのソリューション以下)、このコードを書いてみました。アプリはUIを更新せずにメソッドに入ります。私は実際に timerがすべきことを理解していません。どのようにそれを実行させるためのアイデア?

+1

は、「それは私に例外を与えた」適切な問題の説明ではありません。 –

+2

'ThreadPoolTimer.CreatePeriodicTimer(_clockTimer_Tick、TimeSpan.FromMilliseconds(1000));を使用します。 'タイマーを作成する – Archana

+0

この質問にも私を助けることができますか? http://stackoverflow.com/questions/37511936/using-mediatransportcontrols-with-backgroundmediaplay-in-background-audio-task-u – yalematta

答えて

1

ソリューション:

ThreadPoolTimer timer; 

      // for displaying time only 
      private void CurrentPlayer_MediaOpened(MediaPlayer sender, object args) 
      { 
       timer = ThreadPoolTimer.CreatePeriodicTimer(_clockTimer_Tick, TimeSpan.FromSeconds(1)); 
      } 


      private async void _clockTimer_Tick(ThreadPoolTimer timer) 
      { 
       var dispatcher = Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher; 
       await dispatcher.RunAsync(
       CoreDispatcherPriority.Normal,() => 
       { 

        // Your UI update code goes here! 
        if (CurrentPlayer.NaturalDuration.TotalSeconds < 0) 
        { 
         TimeSpan currentPos = CurrentPlayer.Position; 
         var currentTime = string.Format("{0:00}:{1:00}", (currentPos.Hours * 60) + currentPos.Minutes, currentPos.Seconds); 
         CurrentPosition.Text = currentTime; 
        } 

       }); 
      } 
関連する問題