DispatcherTimer не обновляется с запущенным AdControl

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

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

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

2 ответа

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

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

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

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

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

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

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

Задача решена!

Другие вопросы по тегам