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

本文关键字:运行 后台 代码 每天 UWP 午夜 | 更新日期: 2023-09-27 17:59:08

我认为标题不言自明:我每天都在努力启动后台任务,例如在午夜。该任务已通过TimeTrigger正确注册,并添加到Manifest中,但结果各不相同,有时它只在手机上启动,有时只在电脑上启动,其他时候根本不会。

请告诉我什么是正确的方法。我在应用程序中完成了除此之外的所有操作。

提前谢谢。

编辑:我现在的做法是使用两个后台任务:每个任务都使用一个TimeTrigger,第一个任务设置为在午夜运行一次,它的唯一用途是安排第二个任务每24小时运行一次。但正如我早些时候所说,它并没有像预期的那样起作用。

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

OS可以取消/终止后台任务,无论是否发出通知。例如如果你注册了一个间隔15分钟的bgtask并执行任务取消,你可能会看到该任务在一天内被取消了好几次。

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

  1. 在bgtask上执行取消
  2. 每隔1小时注册一次任务
  3. 在任务开始时,检查时间和标志,如果时间是"午夜"且未设置标志,则执行任务
  4. 在localsettings中设置"done"标志

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

我的回答可能会对你有所帮助时间触发器未触发背景任务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();
        }
    }