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";
});
}
Задача решена!