3

虽然点击了不起作用 的场景,但无法理解 和 之间的区别GoToPlaylistItemGoToPlaylistItemOnNextTickGoToPlaylistItemOnNextTickGoToPlaylistItem

如果您想知道是否有任何差异,请查看这篇文章,了解通过使用GoToPlaylistItemOnNextTickwhile 它抛出空异常解决的问题GoToPlaylistItem

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

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

1 回答 1

1

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 线程空闲时才会发生。

于 2010-09-21T08:29:35.737 回答