问题 我们如何在WinRT应用程序中设置计时器?


我想在我的Windows应用商店应用中设置Timer。

    public void Start_timer()
    {

        Windows.UI.Xaml.DispatcherTimer timer = new DispatcherTimer();           
        timer.Tick += new Windows.UI.Xaml.EventHandler(timer_Tick);
        timer.Interval = new TimeSpan(00, 1, 1);
        bool enabled = timer.IsEnabled;              // Enable the timer
        timer.Start();                              // Start the timer      
      }

在按钮上单击我调用上面的方法来设置此计时器。但是当设置了Tickhand的Eventhandler时,我会收到错误   “试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

我们是否需要在Windows应用商店应用中以不同方式处理定时器?


10475
2018-01-31 11:25


起源

如果你把定时器变成一个字段,那会发生什么,以及timer.Tick + = timer_Tick; timer.Interval = new TimeSpan(00,1,1);转向构造者。 bool enabled = timer.IsEnabled;没有效果,是吗? - Lukasz Madon
@lukas对不起,没有得到你的第一点。请你详细说明 - Sap
private DispatcherTimer timer = new DispatcherTimer(); public YourClass(){timer.Tick + = timer_Tick; timer.Interval = new TimeSpan(00,1,1); } - Lukasz Madon
@lukas完成..谢谢:) - Sap
它解决了问题或帮助找到原因? - Lukasz Madon


答案:


解决方案是将Timer移出方法,例如

private DispatcherTimer timer = new DispatcherTimer();

并在ctor中设置它

public TheClass()
{
    timer.Tick += timer_Tick; 
    timer.Interval = new TimeSpan(00, 1, 1);
    timer.Start();
}

很难说没有完整代码的原因是什么,但它可能是timer_Tick的行为。


10
2018-02-03 13:31



它的缺点是它在UI线程上运行。因此,如果timer事件正在执行时间/ CPU消耗任务,则UI会挂起一点 - Tilak
不是这样做是异步:) - 70sCommander