2017-04-07 2 views
0

Ich habe PlaybackModel Klasse, die ich in der MainPage meiner app instanziiert, etwa so:falschen Thread Ausnahme, wenn ein Objekt der Eigenschaft von einem Ereignisdelegaten Wechsel

if(PlaybackModel.Current == null) new PlaybackModel(); 

verwende ich die PlaybackModel für Verweise auf Objekte zu speichern Ich benutze in meiner App. Es funktioniert auch als ViewModel für die meisten Seiten. Er definiert diese Eigenschaften unter anderem:

public MediaPlayer player { get; set; } 
public MediaPlaybackState playbackState { get; set; } 
public RepeatMode repeatMode { get; set; } 
public MediaPlaybackList queue { get; set; } 
[AlsoNotifyFor("currentIndex", "currentTrack")] 
public MediaPlaybackItem currentItem { get; set; } 
public ObservableCollection<PlaybackItemViewModel> tracks { get; set; } 
public int currentIndex { 
    get { 
     return (int)queue.CurrentItemIndex; 
    } set { 
     System.Diagnostics.Debug.WriteLine("CurrentIndex Setter called! Value: "+value); 
     if (value >= 0 && queue.Items.Count() > value && value != queue.CurrentItemIndex) 
      queue.MoveTo((uint)value); 
    } 
} 
public PlaybackItemViewModel currentTrack { get { if (currentIndex == -1) return null; if (tracks.Count() > currentIndex) return tracks[currentIndex]; else return null; } } 
private TimeSpan _currentPosition; 
public TimeSpan currentPosition { get { return _currentPosition; } set { _currentPosition = value; player.PlaybackSession.Position = _currentPosition; } } 
public TimeSpan currentDuration { get; set; } 
public Library library { get; set; } 
public LastfmClient lastFm { get; set; } 

Im Inspektor der PlaybackModel ich einige Ereignisse bin abonnieren, um zu verfolgen, was mit dem Media-Player los ist und die Warteschlange, so kann ich es später zeigen in die Benutzeroberfläche. Zum Beispiel:

player.PlaybackSession.PlaybackStateChanged += (o, ea) => 
{ 
     playbackState = o.PlaybackState; 
}; 

Aber das wird nicht funktionieren. Es löst eine WRONG_THREAD Ausnahme aus. Es ist das gleiche für all diese anderen Ereignisse. Ich habe auch versucht, mit der await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync()-Methode den Code auf dem UI-Thread auszuführen, aber wie ich es verstehe, wird dies nicht funktionieren, wenn die App im Hintergrund-Wiedergabemodus ist. Wie kann ich es auf eine andere Art und Weise tun, so dass es die Hintergrundwiedergabe unterstützt?

Denn jetzt habe ich beschlossen, das für mein ItemChanged Ereignis zu verwenden:

queue.CurrentItemChanged += async (o, ea) => 
{ 
    await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
    { 
     var pos = currentPosition.Duration(); 
     var bg = App.Ref.IsBackground; 
     Task<ScrobbleResponse> res = null; 
     currentPosition = TimeSpan.Zero; 
     currentItem = o.CurrentItem; 
     if (ea.OldItem != null) 
     { 
      var vm = ea.OldItem.Source.CustomProperties["vm"] as PlaybackItemViewModel; 
      if (pos.TotalSeconds >= ea.OldItem.Source.Duration.Value.TotalSeconds * 0.9) 
      { 
       res = lastFm.Scrobbler.ScrobbleAsync(new Scrobble(vm.Artist, vm.Album, vm.Title, DateTimeOffset.Now)); 
      } 
     } 
     if (currentItem != null) 
      currentDuration = o.CurrentItem.Source.Duration.Value; 
     else currentDuration = TimeSpan.Zero; 
    }); 
}; 

Gibt es eine andere Möglichkeit, es zu tun?

Danke!

+0

Macht nichts, ich habe das Problem herausgefunden. – Reynevan

Antwort

0

Der Code im Dispatcher wird ordnungsgemäß ausgeführt. Es ist die if-Anweisung, die nicht aufgerufen wird, da die Bedingungen nicht im Hintergrund aktualisiert werden. Mein Fehler.

Verwandte Themen