从线程更新UI元素

时间:2014-06-07 08:47:48

标签: c# windows-phone-8 windows-phone

我尝试在Windows手机计时器中创建,每10-15毫秒更新一次(对于UI元素)。我希望有机会追加时间。所以我创建TimeSpan和DispatcherTimer,其中interval = 15 ms。所以每15毫秒调用一次事件,其中i减去15 ms到timeSpan,当timepan< = 0时,我调用一些方法。当我设置TimeSpan 4秒(例如)时,生命超过4秒约4,6秒。我也尝试使用async / await,但这确实无效。我尝试使用System.Threading,但我不知道如何更新在另一个线程中创建的元素。

3 个答案:

答案 0 :(得分:2)

  

所以每15毫秒调用一次事件,其中我减去15毫秒到timeSpan

这就是你的问题。

在任何Windows平台上设置计时器时,您都无法获得高精度。在桌面上我相信消费者硬件上的正常调度时间约为12毫秒(当然其他应用程序可以大大减少它)。我不知道电话的时间安排是什么,但我认为它不如桌面准确(出于电池寿命的原因)。

所以,你根本无法在Windows上以这种方式解决这个问题,因为你不能假设计时器会每15ms触发一次。相反,只需将DispatcherTimer启动到您需要的全部时间范围,例如4秒。

答案 1 :(得分:2)

So every 15 ms call the event where i subtract 15 ms to timeSpan and when timespan <= 0 i call some method.

你的逻辑是有缺陷的。你不可能以这种方式更新你的时间跨度,因为:

  1. 正如Stephen Cleary在答案中提到的那样,你无法保证计时器将在15毫秒时启动
  2. 即使它确实如此,它也没有考虑实际更新你的时间跨度所需的时间(比如计算新的时间跨度需要1ms,你的计时器每15ms会漂移1ms)。
  3. 要获得准确的时间,您需要存储启动它的时间戳(使用DateTime.UtcNow检索它。每次计时器勾选时,请采用新的时间戳并减去您保存的时间戳。方式,你确切地知道已经过了多少时间,你的计时器永远不会漂移。

    private DateTime start; // Set this with DateTime.UtcNow when starting the timer
    
    void timer_Tick(object sender, EventArgs e)
    {
        // Compute the new timespan
        var timespan = DateTime.UtcNow - start;
    
        // Do whatever with it (check if it's greater than 4 seconds, display it, ...)
    }
    

答案 2 :(得分:0)

尝试此更新计时器线程中的UI元素

 Dispatcher.BeginInvoke(() =>
        {
            //Update Your Element.
        });