2016-05-29 13 views
1

Я делаю приложение UWP с помощью BackgroundAudioTask. Мое приложение работает очень хорошо. Теперь я хочу добавить в TextBlock текущую позицию воспроизводимого звука.Использование ThreadPoolTimer с фоном Аудио 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; 
       } 
      } 
     } 

Когда я реализовал фоновую задачу он дал мне исключение. После исследования я увидел предложение использовать ThreadPoolTimer вместо dispatcherTimer.

Я пытался писать этот код (после этого решения: Clock program employing ThreadPoolTimer C# uwp)

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; 
       } 

      }); 
     } 

Это, очевидно, не работает. Приложение входит в метод без обновления моего пользовательского интерфейса. Я действительно не понимаю, что должно быть 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; 
        } 

       }); 
      } 

 Смежные вопросы

  • Нет связанных вопросов^_^