【问题标题】:CreatePeriodicTimer not updating UI when UWP app minimizedUWP 应用最小化时 CreatePeriodicTimer 不更新 UI
【发布时间】:2018-09-05 22:54:02
【问题描述】:

我尝试在 UWP 应用中使用 CreatePeriodicTimer 使用示例日期时间场景更新 UI。

我看到它在应用程序处于前台时工作,它被最小化的那一刻它停止触发事件。

但在调试模式下,即使应用程序被最小化,计时器也会触发并且 UI 会更新,但在发布模式下不会发生。

我还需要知道它在最小化模式下是如何更新的。

namespace PeriodicPolling
{
    class Poller
    {
        public static Poller _instance = null;
        ThreadPoolTimer _timer = null;
        public static MainPage UpdatePage { get; set; }
        public static Poller GetInstance()
        {
            if (_instance == null)
            {
                _instance = new Poller();
            }
            return _instance;
        }
        public void StartPoll()
        {
            _timer = ThreadPoolTimer.CreatePeriodicTimer(PollAndUpdateData, TimeSpan.FromSeconds(10));
        }
        async void PollAndUpdateData(ThreadPoolTimer timer)
        {
            DateTime dateTime = DateTime.Now;
            await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync
                (CoreDispatcherPriority.High,
                    new DispatchedHandler(() =>
                    {
                        UpdatePage.MyBlock.Text = dateTime.ToString();
                    }
                ));
        }
        public void StopPoll()
        {
            _timer.Cancel();
        }
    }
}

【问题讨论】:

    标签: uwp


    【解决方案1】:

    问题是 UWP 应用在最小化时会进入suspended mode

    当用户最小化应用程序时,Windows 会等待几秒钟才能看到 用户是否会切换回它。如果他们不转回来 在此时间窗口内,没有扩展执行、后台任务、 或活动赞助的执行处于活动状态,Windows 会暂停应用程序。 只要没有出现锁屏,应用程序也会暂停 扩展执行会话等在该应用程序中处于活动状态。

    在附加调试器时不会发生这种情况,但您可以使用 Debug Location 工具栏(Ctrl + Q 和输入调试位置或点击查看 -> 工具栏 -> 调试位置

    当您的应用最小化时,会调用Application.Suspending 事件,您可以处理它以释放任何资源或在应用“休眠”时停止计时器。

    还可以让应用在最小化时完全运行。有关这方面的更多信息,请参阅documentation。然而,最好的选择是尽可能降低后台应用程序的使用率,并将后台任务用于长时间运行的进程。

    【讨论】:

    • 感谢您的建议,它成功了。但是我需要在应用程序打开时无限期地轮询一些 API。但相比之下,我开始知道后台任务是用于短期操作的。甚至应用程序触发后台任务最多运行 10 分钟。请帮助我在 UWP 中的某个模型中,我可以无限期地轮询,直到应用程序关闭。
    • 在这种情况下,我的答案中链接的解决方案可能是最好的选择 - docs.microsoft.com/en-us/windows/uwp/launch-resume/…
    • 我看到,如果我们想要执行某些代码,即使在暂停状态一段时间但不是无限期之后,也会使用您提供的这个 ExtendedExecution 建议。当应用程序被挂起时,会要求这样做。但我的要求是在应用程序处于活动状态和暂停期间我应该能够无限期地查询 API 并提供通知。请帮忙
    • 恐怕根本不可能在应用程序实际挂起时运行代码。您可以运行定期后台任务来检查通知或实现推送通知服务来实现这样的解决方案
    • 我已经回顾了这些方法。我尝试了定期后台任务,所以只在我的第一条评论中问你它不会无限期地运行,最长 10 分钟。因此,这里的任何解决方案都可以在没有时间限制的情况下运行定期后台任务。注册你提到的推送通知服务,我想应该有一个云服务向 WNS 发送推送,然后我们在客户端应用程序中处理,对吗?
    猜你喜欢
    • 2010-12-21
    • 2020-06-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 2020-10-27
    • 1970-01-01
    相关资源
    最近更新 更多