如何在UWP的背景中每天午夜运行一些代码?

时间:2016-07-27 21:54:04

标签: c# uwp background-task

我认为标题是自我解释的:例如,我每天都在午夜努力解雇背景任务。使用TimeTrigger正确注册任务,添加到Manifest但结果各不相同,有时它仅在手机上触发,有时仅在PC上触发,其他任何时候都没有。

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

提前致谢。

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

1 个答案:

答案 0 :(得分:3)

操作系统可以取消/终止后台任务WITH或不通知。 例如......如果您注册15分钟的bgtask并执行任务取消,您可能会在一天内看到该任务被多次取消。

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

  1. 在您的bgtask实施取消。
  2. 以1小时的间隔注册您的任务。
  3. 在任务开始时,检查时间和标志,如果时间是“午夜”并且未设置标志,则执行任务。
  4. 在localsettings设置'done'标志。
  5. 背景取消的详细信息在这里。 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();
            }
    
        }