GoToPlaylistItem和GoToPlaylistItemOnNextTick有什么区别

时间:2010-09-14 10:04:55

标签: c# .net wpf silverlight playlist

无法理解GoToPlaylistItemGoToPlaylistItemOnNextTick之间的差异,但GoToPlaylistItemOnNextTick点击GoToPlaylistItem不起作用的情景。

如果您想知道是否存在任何差异,请查看Post使用GoToPlaylistItemOnNextTick解决问题,同时使用GoToPlaylistItem抛出空例外

当我导航到定义时,我得到了以下细节。有人可以解释一下吗?

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

1 个答案:

答案 0 :(得分:1)

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。这可确保在UI线程空闲时调用GoToPlaylistItem

如果您依赖于MediaPlayer触发的某些事件,例如StateChanged,则差异可能会很大。如果您致电GoToPlaylistItem,此事件将在GoToPlaylistItem返回之前立即执行。如果您调用GoToPlaylistItemOnNextTick,则只有当您的当前方法完成并且UI线程处于空闲状态时才会发生该事件。