DispatcherTimer не обновляется с запущенным AdControl - PullRequest
0 голосов
/ 23 ноября 2011

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

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

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

Ответы [ 2 ]

0 голосов
/ 06 декабря 2012

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

Согласно документации 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";
        });
}

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

0 голосов
/ 23 ноября 2011

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

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

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

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

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

...