MediaPlayer
在内部使用 a 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
当 UI 线程空闲时将被调用。
如果您依赖某些MediaPlayer
触发的事件,例如StateChanged
. 如果您调用GoToPlaylistItem
,此事件将在GoToPlaylistItem
返回之前立即执行。如果您调用GoToPlaylistItemOnNextTick
,则该事件仅在您当前方法完成并且 UI 线程空闲时才会发生。