UWP后台任务计时器未触发

时间:2017-03-27 23:11:21

标签: c# background uwp

我目前正在开发一个具有后台任务的应用,该应用应该在用户设置的时间时触发。例如,用户选择“01:45 PM”,应用程序正在计算从现在到该时间的分钟数,使用timetrigger注册后台任务。不幸的是,后台任务根本没有开火。有时它在我启动计算机后才被解雇。我感谢任何建议,因为一周后我无法解决这个问题。

我已经通过VisualStudio启动调试后台任务,因此问题不在BackgroundTask.cs文件中。

这是我的代码:

  • 注册后台任务:

    //I set the time to 15 minutes to see if this would work. It didn't...
    var trigger = new TimeTrigger(15, true);
    BackgroundTaskHelper.RegisterBackgroundTask("BackgroundTask.BackgroundTask", "BackgroundTask", trigger, null);
    
  • 注册后台任务的方法:

    public static async void RegisterBackgroundTask(string taskEntryPoint, string taskName, IBackgroundTrigger trigger, IBackgroundCondition condition)
    {
        foreach (var cur in BackgroundTaskRegistration.AllTasks)
        {
            if (cur.Value.Name == taskName)
            {
                cur.Value.Unregister(true);
            }
        }            
        var builder = new BackgroundTaskBuilder();
        builder.Name = taskName;
        builder.TaskEntryPoint = taskEntryPoint;
        builder.SetTrigger(trigger);
    
        if (condition != null)
        {
            builder.AddCondition(condition);
        }
    
        await BackgroundExecutionManager.RequestAccessAsync();
        var task = builder.Register();
    }
    
  • Package.appxmanifest Package.appxmanifest, Image

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

创建新的TimeTrigger。第二个参数OneShot指定后台任务是仅运行一次还是定期运行。如果OneShot设置为true,则第一个参数(FreshnessTime)指定在安排后台任务之前等待的分钟数。如果OneShot设置为false,则FreshnessTime指定background task将运行的频率。

如果FreshnessTime设置为15分钟且OneShot为true,则任务将从注册时起15到30分钟之间运行一次。如果设置为25分钟且OneShot为真,则任务将从注册时起25到40分钟之间运行一次。

因此TimeTrigger不适合您的情况。在Windows 10 UWP中,警报只是具有“警报”方案的Toast通知。要在特定时间显示警报,您可以使用预定的Toast通知。

以下代码是如何安排闹钟在特定时间出现。详情请参阅Quickstart: Sending an alarm in Windows 10。随附的sample application是一个简单的快速启动警报应用程序。

DateTime alarmTime = DateTime.Now.AddMinutes(1);

// Only schedule notifications in the future
// Adding a scheduled notification with a time in the past
// will throw an exception.
if (alarmTime > DateTime.Now.AddSeconds(5))
{
    // Generate the toast content (from previous steps)
    ToastContent toastContent = GenerateToastContent();

    // Create the scheduled notification
    var scheduledNotif = new ScheduledToastNotification(
        toastContent.GetXml(), // Content of the toast
        alarmTime // Time we want the toast to appear at
        );

    // And add it to the schedule
    ToastNotificationManager.CreateToastNotifier().AddToSchedule(scheduledNotif);
}