无法理解GoToPlaylistItem
和GoToPlaylistItemOnNextTick
之间的差异,但GoToPlaylistItemOnNextTick
点击GoToPlaylistItem
不起作用的情景。
如果您想知道是否存在任何差异,请查看Post使用GoToPlaylistItemOnNextTick
解决问题,同时使用GoToPlaylistItem
抛出空例外
当我导航到定义时,我得到了以下细节。有人可以解释一下吗?
[ScriptableMember]
public virtual void GoToPlaylistItem(int playlistItemIndex);
public void GoToPlaylistItemOnNextTick(int playlistItemIndex);
答案 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线程处于空闲状态时才会发生该事件。