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
, то событие произойдет только позже, когда ваш текущий метод завершится, а поток пользовательского интерфейса будет бездействовать.
person
Timwi
schedule
21.09.2010