В чем разница между GoToPlaylistItem и GoToPlaylistItemOnNextTick

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

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

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

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

person Simsons    schedule 14.09.2010    source источник


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

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

person Timwi    schedule 21.09.2010