Чем отличается GoToPlaylistItem от GoToPlaylistItemOnNextTick - PullRequest
3 голосов
/ 14 сентября 2010

Невозможно понять разницу между GoToPlaylistItem и GoToPlaylistItemOnNextTick, хотя GoToPlaylistItemOnNextTick нажимал на сценарии, в которых GoToPlaylistItem не работает.

Если вам интересно, есть ли какие-либо различия, посмотрите на эту публикацию на проблему, решенную с помощью GoToPlaylistItemOnNextTick, когда она выдавала нулевое исключение с GoToPlaylistItem

Пока я направлялся к определению, я получил следующие детали.Может кто-нибудь объяснить?

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

1 Ответ

1 голос
/ 21 сентября 2010

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. Это гарантирует, что GoToPlaylistItem будет вызываться, когда поток пользовательского интерфейса простаивает.

Разница может быть существенной, если вы полагаетесь на некоторые события, которые запускаются MediaPlayer, например StateChanged. Если вы позвоните GoToPlaylistItem, это событие будет выполнено непосредственно перед возвратом GoToPlaylistItem. Если вы вызываете GoToPlaylistItemOnNextTick, то событие произойдет только позже, когда ваш текущий метод завершится и поток пользовательского интерфейса простаивает.

...