c# - GoToPlaylistItem 和 GoToPlaylistItemOnNextTick 有什么区别

标签 c# .net wpf silverlight playlist

无法理解 GoToPlaylistItemGoToPlaylistItemOnNextTick 之间的区别,尽管 GoToPlaylistItemOnNextTick 单击了 GoToPlaylistItem 的场景不工作。

如果您想知道是否存在任何差异,请查看此 Post对于使用 GoToPlaylistItemOnNextTick 解决的问题,同时使用 GoToPlaylistItem

抛出空异常

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

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

最佳答案

MediaPlayer 在内部使用了一个 Timer。此计时器是在名为 CreatePositionTimer 的 protected 方法中创建的:

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

关于c# - GoToPlaylistItem 和 GoToPlaylistItemOnNextTick 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3707866/

相关文章:

C# "cached debug log"

c# - 从 WRL COM 组件获取托管回调

c# - 如何在代码中设置绑定(bind)?

wpf - 如何防止WPF触发器在退出时重置原始值

c# - 更改窗口内容 (WPF)

c# - 在 C# 中覆盖派生类中的常量

c# - ASP.NET MVC - 登录成功,但 userId 返回 null

.net - Entity Framework Core 连接管理

.net - UI 和后台线程之间的交叉线程

c# - 当传递给另一个对象时,谁应该在 IDisposable 对象上调用 Dispose?