0

我有一个简单的应用程序,我正在创建一个使用 aDispatcherTimer作为时间基准的倒数计时器。我为 DispatcherTimer 的 On_Tick 设置了一个事件处理程序(设置为 1 秒间隔)。我有三 (3) 个使用三个不同实例的数据透视页面,AdControl并且所有这些页面都是具有真实 ApplicationID 和 AdUnitID 的“实时”页面。此计时器设置在其中一个数据透视页面上。

我看到的是,当我打开我的应用程序并且 AdControl 启动时,60 秒后,adControl 想要刷新。我的计时器在第一分钟工作正常,然后开始每三秒失去一秒,就像它错过了一个滴答事件(巧合的是,当 adcontrol 每三秒“滚动”到一条新消息时?)。我尝试为 dispatcherTimer 使用后台工作人员,但这似乎对我没有任何帮助。事件处理程序中的代码相当短,只有几个“if-then”语句和几个 textBlock 更新。

其他人看到 AdControl 的类似问题吗?

4

2 回答 2

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";
        });
}

问题解决了!

于 2012-12-05T22:35:55.013 回答
0

我会说原因是广告控件和计时器都想在 UI 线程上做一些事情。因此,当广告控件忙时,计时器操作在此期间被阻止。引用MSDN

定时器不能保证在时间间隔发生时准确执行,但可以保证在时间间隔发生之前不会执行。这是因为 DispatcherTimer 操作像其他操作一样放置在 Dispatcher 队列中。DispatcherTimer 操作何时执行取决于队列中的其他作业及其优先级。

它还解释了为什么使用后台工作人员没有帮助。一旦你从另一个线程返回到 UI 线程,你就会再次遇到同样的问题。所以这个问题基本上是设计使然。

哦,它也可以反过来。如果您要在 UI 线程中进行大量工作,则广告控件将被阻止。以及您的 UI 的其余部分。这就是为什么您应该在后台线程中做尽可能多的工作的原因。也许广告控件不遵守此建议。

到目前为止,这可能对您没有太大帮助。但也许可以只使用一个 AdControl 并在用户平移时将其从 Pivot 移动到 Pivot?

于 2011-11-22T23:19:13.017 回答