C# GoToPlaylistItem和GoToPlaylistItemOnNextTick之间有什么区别

C# GoToPlaylistItem和GoToPlaylistItemOnNextTick之间有什么区别,c#,.net,wpf,silverlight,playlist,C#,.net,Wpf,Silverlight,Playlist,无法理解GoToPlaylistItem与GoToPlaylistItemOnNextTick之间的区别,尽管在GoToPlaylistItemOnNextTick不起作用的场景中单击了GoToPlaylistItem 如果您想知道是否存在任何差异,请查看此示例,了解使用GoToPlaylistItemOnNextTick解决的问题,同时使用GoToPlaylistItem引发空异常 当我导航到定义时,我得到了以下细节。有人能解释一下吗 [ScriptableMember] public vir

无法理解GoToPlaylistItem与GoToPlaylistItemOnNextTick之间的区别,尽管在GoToPlaylistItemOnNextTick不起作用的场景中单击了GoToPlaylistItem

如果您想知道是否存在任何差异,请查看此示例,了解使用
GoToPlaylistItemOnNextTick
解决的问题,同时使用
GoToPlaylistItem
引发空异常

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

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

MediaPlayer
在内部使用
计时器。此计时器是在名为
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.dispatchermer
。这可确保在UI线程空闲时调用
GoToPlaylistItem


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

谢谢。很高兴知道这是怎么回事?但是为什么GoToPlaylistItem在GoToPlaylistItemOnNextTick工作时有时会给出空引用错误。指向His代码的链接使用相同的方法调用名为
setPlayList()
的内容。显然,我不知道它做了什么,但如果它试图更改播放列表(这很可能),则可能是MediaPlayer需要先更新播放列表,然后才能跳转到其中的项目。