如何在 UWP 的后台每天午夜运行一些代码?

Posted

技术标签:

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

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

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

提前致谢。

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

【问题讨论】:

【参考方案1】:

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

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

    在您的 bgtask 中实现取消。 以 1 小时的间隔记录您的任务。 任务开始时,检查时间和旗帜,如果时间是“午夜”且未设置旗帜,则执行任务。 在 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();
        

    

【讨论】:

谢谢老兄!我接受了你的回答,即使我很生气开发人员不能像官方警报应用程序那样在特定时间安排后台任务。而且我不记得有一次闹钟被取消。微软真的应该给开发者更多的权力。这是一个耻辱。再次感谢。我会尝试你的想法几天看看。

以上是关于如何在 UWP 的后台每天午夜运行一些代码?的主要内容,如果未能解决你的问题,请参考以下文章

每天午夜进行选择的 ASP.NET 例程 [关闭]

如何编写一个每天午夜运行脚本的 cron?

如何在 UWP 后台任务中使用 XAML UI 元素?

节点cron,每隔午夜运行一次

如何安排 C# Windows 服务每天执行任务?

UWP 后台任务 - 应用程序触发器 - 当文件已存在时无法创建文件