DispatcherTimer не обновляется при работающем AdControl

У меня есть простое приложение, которое я создаю с таймером обратного отсчета, который использует DispatcherTimer для временной базы. У меня есть настройка обработчика событий для On_Tick DispatcherTimer (устанавливается на интервал в 1 секунду). У меня есть три (3) сводные страницы, использующие три разных экземпляра AdControl, и все они «живые» с реальными ApplicationID и AdUnitID. Этот таймер настраивается на одной из сводных страниц.

Что я вижу, так это то, что когда я открываю свое приложение и запускается AdControl, через 60 секунд adControl хочет обновиться. Мой таймер работает нормально в течение первой минуты, затем начинает терять секунду каждые три секунды, как будто ему не хватает события тика (по совпадению, когда рекламный элемент управления «прокручивает» новое сообщение каждые три секунды?). Я пытался использовать фонового работника для dispatcherTimer, но мне это, похоже, ничего не дало. Код в обработчике событий довольно короткий, всего пара операторов «if-then» и несколько обновлений textBlock.

Кто-нибудь еще видел подобные проблемы с AdControl?


person user1030679    schedule 22.11.2011    source источник


Ответы (2)


Я бы сказал, что причина в том, что элемент управления рекламой и таймер хотят что-то сделать в потоке пользовательского интерфейса. Таким образом, когда управление рекламой занято, действие таймера на это время блокируется. Чтобы процитировать MSDN:

Не гарантируется, что таймеры будут выполняться точно, когда наступит временной интервал, но они гарантированно не будут выполняться до того, как наступит временной интервал. Это связано с тем, что операции DispatcherTimer помещаются в очередь Dispatcher, как и другие операции. Время выполнения операции DispatcherTimer зависит от других заданий в очереди и их приоритетов.

Это также объясняет, почему использование фонового рабочего не помогает. Как только вы вернетесь из другого потока в поток пользовательского интерфейса, у вас снова возникнет та же проблема. Так что эта проблема в основном по дизайну.

О, а может быть и наоборот. Если вы будете выполнять интенсивную работу в потоке пользовательского интерфейса, тогда управление рекламой будет заблокировано. Как и остальная часть вашего пользовательского интерфейса. Вот почему вы должны выполнять как можно больше работы в фоновых потоках. Возможно, управление рекламой не придерживается этого совета.

Пока это, вероятно, не поможет вам много. Но, возможно, можно просто использовать один AdControl и перемещать его из Pivot в Pivot, когда пользователь перемещается?

person Heinrich Ulbricht    schedule 22.11.2011

Я столкнулся с той же проблемой с моим собственным приложением в стиле таймера. В моем случае это происходит только тогда, когда в текущей рекламе есть анимация.

Согласно документации DispatcherTimer, задержка является ожидаемым поведением, поэтому решение использовать другой таймер... например, System.Threading.Timer

...
    //create the timer
    var timer = new System.Threading.Timer(
        new System.Threading.TimerCallback(TimerTick), 
        null, 
        //Set the due time to infinite so the timer wont start immediately
        System.Threading.Timeout.Infinite,
        0);

    //start the timer
    timer.Change(0, 1000);

    //stop the timer
    timer.Change(System.Threading.Timeout.Infinite, 0);
}

void TimerTick(object state)
{
    //Dont forget to update the UI on the UI thread.
    Dispatcher.BeginInvoke(() =>
        {
            MyTextBox.Text = "New Text";
        });
}

Проблема решена!

person Silver Solver    schedule 05.12.2012