2010-09-14 21 views
3

Impossible de comprendre la différence bettwen GoToPlaylistItem et GoToPlaylistItemOnNextTick, bien que GoToPlaylistItemOnNextTick cliqués sur des scénarios où GoToPlaylistItem travail din't.Quelle est la différence bettwen GoToPlaylistItem et GoToPlaylistItemOnNextTick

Si vous vous demandez s'il y a des différences, consultez à ce Post pour un problème résolu en utilisant GoToPlaylistItemOnNextTick alors qu'il vomissait exception nulle avec GoToPlaylistItem

Pendant que je naviaged au defination j'ai obtenu les détails suivants. Quelqu'un pourrait-il expliquer?

[ScriptableMember] 
public virtual void GoToPlaylistItem(int playlistItemIndex); 
public void GoToPlaylistItemOnNextTick(int playlistItemIndex); 

Répondre

1

MediaPlayer utilise un Timer interne. Cette minuterie est créé dans une méthode protégée appelée CreatePositionTimer:

protected void CreatePositionTimer(TimeSpan interval) 
{ 
    if (m_timer == null) 
    { 
     m_timer = new DispatcherTimer(); 
     m_timer.Interval = interval; // 6 NTSC frames 
     m_timer.Tick += new EventHandler(OnTimerTick); 
    } 
} 

La méthode GoToPlaylistItemOnNextTick définit simplement quelques variables internes:

public void GoToPlaylistItemOnNextTick(int playlistItemIndex) 
{ 
    if (!m_goToItemOnNextTick) // don't set it if already set 
    { 
     m_goToItemOnNextTick = true; 
     m_goToItemOnNextTickIndex = playlistItemIndex; 
    } 
} 

La prochaine fois que la minuterie arrive, OnTimerTick est appelé, et ce contrôle pour les variables ci-dessus et appelle ensuite GoToPlaylistItem:

void OnTimerTick(object sender, EventArgs e) 
{ 
    [...] 

    if (m_goToItemOnNextTick) 
    { 
     m_goToItemOnNextTick = false; 
     GoToPlaylistItem(m_goToItemOnNextTickIndex); 
    } 

    [...] 
} 

donc, la différence est que GoToPlaylistItem ira à l'élément de la playlist suivante immédiatement, tandis que GoToPlaylistItemOnNextTick le fera à la coche de la prochaine minuterie. La minuterie spécifique utilisée est System.Windows.Threading.DispatcherTimer. Cela garantit que GoToPlaylistItem sera appelée lorsque le thread de l'interface utilisateur est inactif.

La différence peut être significative si vous comptez sur certains des événements déclenchés par MediaPlayer, par exemple StateChanged. Si vous appelez GoToPlaylistItem, cet événement sera exécuté immédiatement avant que le GoToPlaylistItem ne renvoie. Si vous appelez GoToPlaylistItemOnNextTick, l'événement ne se produira plus tard que lorsque votre méthode actuelle est terminée et que le thread de l'interface utilisateur est inactif.

+0

Merci. Bon à savoir ce qui s'est passé, mais pourquoi GoToPlaylistItem donne parfois une erreur de référence nulle alors que GoToPlaylistItemOnNextTick fonctionne. Lien vers le [Post] (http://stackoverflow.com/questions/2873359/null-reference-exception-while-navigating-to-playlistitem "Exception de référence nulle lors de la navigation vers PlayListItem.") – Simsons

+1

Son code appelle quelque chose appelé ' setPlayList() 'dans la même méthode. Évidemment je ne peux pas savoir ce qu'il fait, mais s'il essaie d'apporter des modifications à la liste de lecture (ce qui est probable), il se peut que le MediaPlayer ait besoin de mettre à jour la playlist avant de pouvoir accéder à un élément. il. – Timwi