在UWP应用程序中注册后台任务

时间:2015-12-30 20:16:44

标签: c# uwp background-task

我正在努力注册后台任务,因为我想等待的方法仍然被调用..

我也得到错误" Class not registered Exception",但是通过在Declarations>> BackgroundTasks下的清单中添加我的TaskBuilder类作为入口点来解决它。不知道这是不是正确的事情..但它起作用.. :)

这就是我现在用来构建任务的内容:

   public async void RegisterBackgroundTask()
    {
        var tommorowMidnight = DateTime.Today.AddDays(1);
        var timeTilMidnight = tommorowMidnight - DateTime.Now;
        var minutesTilMidnight = (uint)timeTilMidnight.TotalMinutes;

        var task = RegisterBackgroundTask("TaskBuilder",
                                          "TimeTriggeredTask",
                                          new TimeTrigger(minutesTilMidnight, false),
                                          null);
        await task;
        CheckPremieres(); //My method that i want to check only once a day at 00:00
    }

public static async Task<BackgroundTaskRegistration> RegisterBackgroundTask(String taskEntryPoint, String name, IBackgroundTrigger trigger, IBackgroundCondition condition)
        {

            await BackgroundExecutionManager.RequestAccessAsync();

            var builder = new BackgroundTaskBuilder();

            builder.Name = name;
            builder.TaskEntryPoint = taskEntryPoint;
            builder.SetTrigger(trigger);

            BackgroundTaskRegistration task = builder.Register();

            return task;
        }

这是TaskBuilder类:

class TaskBuilder : IBackgroundTask
    {
        BackgroundTaskCancellationReason _cancelReason = BackgroundTaskCancellationReason.Abort;
        volatile bool _cancelRequested = false;
        BackgroundTaskDeferral _deferral = null;
        ThreadPoolTimer _periodicTimer = null;
        uint _progress = 0;
        IBackgroundTaskInstance _taskInstance = null;

        //
        // The Run method is the entry point of a background task.
        //
        public void Run(IBackgroundTaskInstance taskInstance)
        {            
            //
            // Query BackgroundWorkCost
            // Guidance: If BackgroundWorkCost is high, then perform only the minimum amount
            // of work in the background task and return immediately.
            //
            var cost = BackgroundWorkCost.CurrentBackgroundWorkCost;
            var settings = ApplicationData.Current.LocalSettings;
            settings.Values["BackgroundWorkCost"] = cost.ToString();

            //
            // Associate a cancellation handler with the background task.
            //
            taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);

            //
            // Get the deferral object from the task instance, and take a reference to the taskInstance;
            //
            _deferral = taskInstance.GetDeferral();
            _taskInstance = taskInstance;

            _periodicTimer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromSeconds(1));
        }

        //
        // Handles background task cancellation.
        //
        private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            //
            // Indicate that the background task is canceled.
            //
            _cancelRequested = true;
            _cancelReason = reason;
        }

        //
        // Simulate the background task activity.
        //
        private void PeriodicTimerCallback(ThreadPoolTimer timer)
        {
            if ((_cancelRequested == false) && (_progress < 100))
            {
                _progress += 10;
                _taskInstance.Progress = _progress;
            }
            else
            {
                _periodicTimer.Cancel();

                var settings = ApplicationData.Current.LocalSettings;
                var key = _taskInstance.Task.Name;

                //
                // Write to LocalSettings to indicate that this background task ran.
                //
                settings.Values[key] = (_progress < 100) ? "Canceled with reason: " + _cancelReason.ToString() : "Completed";

                //
                // Indicate that the background task has completed.
                //
                _deferral.Complete();
            }
        }
    }

我使用MS在GitHub上的示例:https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/BackgroundTask

这是我过去用来延迟方法调用的内容:

 public void SetTimeToShowNotification(DateTime date)
        {
            var dateNow = DateTime.Now;
            TimeSpan ts;
            if (date > dateNow)
                ts = date - dateNow;
            else
            {
                date = getNextDate(date);
                ts = date - dateNow;
            }
            //waits certan time and run the code
            Task.Delay(ts).ContinueWith((x) =>
            {
                //run the code at the time
                CheckPremieres();

                //setup call next day
                SetTimeToShowNotification(getNextDate(date));

            });
        }
        private DateTime getNextDate(DateTime date)
        {
            if (App.CheckOnce)
            {
                return date.AddSeconds(20);
            }
            return date.AddDays(1);
        }

但这会消耗电池我想想并且在后台工作......

我想要做的就是每天运行一个方法向用户发送通知..那不可能是那个dificullt但我无法让它工作..

0 个答案:

没有答案