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.
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
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