【问题标题】:How to run some code every day at midnight in background in UWP?如何在 UWP 的后台每天午夜运行一些代码?
【发布时间】:2016-07-27 21:54:04
【问题描述】:

我认为标题是不言自明的:我每天都在努力启动后台任务,例如在午夜。该任务已使用 TimeTrigger 正确注册,添加到 Manifest,但结果各不相同,有时仅在手机上触发,有时仅在 PC 上触发,有时根本不会。

请告诉我什么是正确的做法。除了这个,我完成了我的应用程序中的所有内容。

提前致谢。

编辑:我现在的做法是使用 2 个后台任务:每个使用 TimeTrigger,第一个设置为在午夜运行一次,它唯一的用途是安排第二个每 24 小时运行一次。但正如我之前所说,它并没有按预期工作。

【问题讨论】:

    标签: c# uwp background-task


    【解决方案1】:

    操作系统可以在有或没有通知的情况下取消/终止后台任务。 比如……如果你注册一个15min间隔的bgtask并执行任务取消,你可能会看到任务在一天内被取消了好几次。

    我的建议是……尝试在“午夜”内多次运行 bgtask 以解决任务取消的问题。

    1. 在您的 bgtask 中实现取消。
    2. 以 1 小时的间隔记录您的任务。
    3. 任务开始时,检查时间和旗帜,如果时间是“午夜”且未设置旗帜,则执行任务。
    4. 在 localsettings 中设置“完成”标志。

    后台取消的详细信息在这里。 https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/handle-a-cancelled-background-task

    我的回答可能会对你有所帮助 Timetrigger not firing backgroundtask UWP

    这是我的 bgtask 实现。支持取消。

        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            string dbgout = "";
            var startTime = DateTime.Now;
            dbgout += "BgTask ";
    
            var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
            var cancel = new System.Threading.CancellationTokenSource();
            taskInstance.Canceled += (s, e) =>
            {
                dumpLog("Canceled.");
                cancel.Cancel();
                cancel.Dispose();
            };
    
    
            try
            {
                _deferral = taskInstance.GetDeferral();
    
                dbgout += cost.ToString() + " ";
    
                switch (cost)
                {
                    case BackgroundWorkCostValue.Low:
                    case BackgroundWorkCostValue.Medium:
                        await TimeConsumedTaskLowMidAsync().AsTask(cancel.Token);
                        break;
                    case BackgroundWorkCostValue.High:
                        await TimeConsumedTaskHighAsync().AsTask(cancel.Token);
                        break;
                    default:
                        break;
                }
    
            }
            catch (Exception e)
            {
                dbgout += ("Failed " + e.Message + "...");
            }
            finally
            {
                dumpLog(dbgout + " " + (DateTime.Now - startTime).TotalSeconds.ToString("F1"));
                _deferral.Complete();
            }
    
        }
    

    【讨论】:

    • 谢谢老兄!我接受了你的回答,即使我很生气开发人员不能像官方警报应用程序那样在特定时间安排后台任务。而且我不记得有一次闹钟被取消。微软真的应该给开发者更多的权力。这是一个耻辱。再次感谢。我会尝试你的想法几天看看。
    猜你喜欢
    • 2014-12-06
    • 2016-01-02
    • 2015-09-17
    • 2012-08-09
    • 2011-04-28
    • 2016-01-13
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多