【问题标题】:UWP equivalent of Timer.Elapsed eventUWP 等效于 Timer.Elapsed 事件
【发布时间】:2017-04-23 08:38:21
【问题描述】:

我需要每隔几分钟自动触发一次事件。我知道我可以在 Windows 窗体应用程序中使用 Timers.Elapsed 事件来做到这一点,如下所示。

using System.Timers;

namespace TimersDemo
{
    public class Foo
    {
        System.Timers.Timer myTimer = new System.Timers.Timer();

        public void StartTimers()
        {                
            myTimer.Interval = 1;
            myTimer.Elapsed += new System.Timers.ElapsedEventHandler(myTimer_Elapsed);
            myTimer.Start();
        }

        void myTimer_Elapsed(object sender, EventArgs e)
        {
            myTimer.Stop();
            //Execute your repeating task here
            myTimer.Start();
        }
    }
}

我在 Google 上搜索了很多,并努力在 UWP 中找到与此等效的内容。

【问题讨论】:

    标签: c# .net uwp uwp-xaml system.timers.timer


    【解决方案1】:

    以下代码 sn-p 使用 DispatcherTimer 应该提供等效的功能,它在 UI 线程上运行回调。

    using Windows.UI.Xaml;
    public class Foo
    {
        DispatcherTimer dispatcherTimer;
        public void StartTimers()
        {
            dispatcherTimer = new DispatcherTimer();
            dispatcherTimer.Tick += dispatcherTimer_Tick;
            dispatcherTimer.Interval = new TimeSpan(0, 0, 1);
        }
    
        // callback runs on UI thread
        void dispatcherTimer_Tick(object sender, object e)
        {
            // execute repeating task here
        }
    }
    

    当不需要在 UI 线程上更新而你只需要一个计时器时,你可以使用ThreadPoolTimer,像这样

    using Windows.System.Threading;
    public class Foo
    {
        ThreadPoolTimer timer;
    
        public void StartTimers()
        {
            timer = ThreadPoolTimer.CreatePeriodicTimer(TimerElapsedHandler, new TimeSpan(0, 0, 1));
        }
    
        private void TimerElapsedHandler(ThreadPoolTimer timer)
        {
            // execute repeating task here
        }
    }
    

    【讨论】:

    • 我相信是的,谢谢!但是,如果可以的话,我会要求其他读者提供详细的答案。否则,这可以被视为link only 答案。尽管如此,我相信 MSDN 不会很快消失!
    • @DevrajGadhavi 注意 DispatcherTimer 在 UI 线程上运行回调,因此它不完全等同于 System.Timers.Timer。
    • @Evk,我实际上可能需要它在 UI 线程上运行。这样做的主要缺点是什么?此外,任何其他适当的替代方案都将受到赞赏,作为单独的答案。
    • @DevrajGadhavi 常见的缺点 - 如果操作计算成本高或阻塞 - UI 将在此期间冻结。
    • 记得添加dispatcherTimer.Start();
    【解决方案2】:

    最近我解决了类似的任务,当我需要在 UWP 应用程序中定期定时器事件时。

    即使您使用 ThreadPoolTimer,您仍然可以从计时器事件处理程序对 UI 进行非阻塞调用。 可以通过使用 Dispatcher 对象并调用其 RunAsync 方法来实现,如下所示:

    TimeSpan period = TimeSpan.FromSeconds(60);
    
    ThreadPoolTimer PeriodicTimer = ThreadPoolTimer.CreatePeriodicTimer((source) =>
    {
        // 
        // TODO: Work
        // 
    
        // 
        // Update the UI thread by using the UI core dispatcher.
        // 
        Dispatcher.RunAsync(CoreDispatcherPriority.High,
            () =>
            {
                // 
                // UI components can be accessed within this scope.
                // 
    
            });
    
    }, period);
    

    代码sn-p取自这篇文章:Create a periodic work item

    希望对你有帮助。

    【讨论】:

    • 我认为您应该编辑您的答案并发布链接中的重要摘录。这样你也可以开始赢得一些声誉。
    • 谢谢你们的cmets,我根据你们的建议编辑了我的答案。
    • recommended 不使用High 优先级,因为它用于系统事件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多