MediaPlayer
использует Timer
внутри. Этот таймер создан в защищенном методе с именем 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);
}
}
Метод GoToPlaylistItemOnNextTick
просто устанавливает несколько внутренних переменных:
public void GoToPlaylistItemOnNextTick(int playlistItemIndex)
{
if (!m_goToItemOnNextTick) // don't set it if already set
{
m_goToItemOnNextTick = true;
m_goToItemOnNextTickIndex = playlistItemIndex;
}
}
В следующий раз, когда появится таймер, вызывается OnTimerTick
, и это проверяет вышеуказанные переменные, а затем вызывает GoToPlaylistItem
:
void OnTimerTick(object sender, EventArgs e)
{
[...]
if (m_goToItemOnNextTick)
{
m_goToItemOnNextTick = false;
GoToPlaylistItem(m_goToItemOnNextTickIndex);
}
[...]
}
Таким образом, разница в том, что GoToPlaylistItem
немедленно перейдет к следующему элементу списка воспроизведения, в то время как GoToPlaylistItemOnNextTick
сделает это при следующем такте таймера. Конкретный таймер, который он использует, System.Windows.Threading.DispatcherTimer
. Это гарантирует, что GoToPlaylistItem
будет вызываться, когда поток пользовательского интерфейса простаивает.
Разница может быть существенной, если вы полагаетесь на некоторые события, которые запускаются MediaPlayer
, например StateChanged
. Если вы позвоните GoToPlaylistItem
, это событие будет выполнено непосредственно перед возвратом GoToPlaylistItem
. Если вы вызываете GoToPlaylistItemOnNextTick
, то событие произойдет только позже, когда ваш текущий метод завершится и поток пользовательского интерфейса простаивает.