我有一个简单的应用程序,我正在使用倒数计时器创建,该计时器使用DispatcherTimer
作为时基。我为DispatcherTimer的On_Tick设置了事件处理程序(设置为1秒间隔)。我有三(3)个数据透视表页面使用三个不同的AdControl
实例,所有实例都是“实时”的,具有真正的ApplicationID和AdUnitID。此计时器在其中一个枢轴页面上设置。
我所看到的是,当我打开我的应用并且AdControl启动时,60秒后,adControl想要刷新。我的计时器在第一分钟工作正常,然后每三秒开始丢失一秒,就像它缺少一个滴答事件(巧合的是,当adcontrol每隔三秒“滚动”到一条新消息?)。我已经尝试使用后台工作程序为dispatcherTimer,但似乎没有为我做任何事情。事件处理程序中的代码相当短,只有几个“if-then”语句和一些textBlock更新。
其他人看到过与AdControl类似的问题?
答案 0 :(得分:0)
我想说的原因是广告控件和计时器都想在UI线程上做点什么。因此,当广告控制忙时,在此期间阻止计时器操作。引用MSDN:
不保证定时器在时间间隔内完全执行 发生,但保证在时间之前不执行 间隔发生。这是因为放置了DispatcherTimer操作 与其他操作一样在Dispatcher队列中。当。。。的时候 DispatcherTimer操作的执行依赖于其他作业 队列及其优先级。
它还解释了为什么使用后台工作者没有帮助。一旦你从另一个线程返回到UI线程,你再次遇到同样的问题。所以这个问题基本上是设计的。
哦,它也可以反过来。如果您要在UI线程中进行密集工作,那么广告控件将被阻止。以及UI的其余部分。这就是为什么你应该在后台线程中做尽可能多的工作的原因。也许广告控制不遵守这个建议。
到目前为止,这可能对你没什么帮助。但也许有可能只使用一个AdControl并将其从Pivot转移到Pivot,因为用户可以进行操作?
答案 1 :(得分:0)
我在自己的计时器风格应用程序中遇到了同样的问题。在我的情况下,只有在当前广告中有动画时才会出现。
根据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";
});
}
问题解决了!