Timetrigger没有触发后台任务UWP

我和这个人有同样的问题: UWP Timetrigger没有工作,但我无法评论这个问题,因为我的声誉不够高,所以我正在创建一个新问题。

正如我所说,我有同样的问题。 我注册了后台任务,但没有任何反应。 我的后台任务位于一个单独的项目(运行时组件)中。 所以这不是问题。 这是我注册任务的方法:

public static BackgroundTaskRegistration Register(string name, string taskEntryPoint, IBackgroundTrigger trigger, IBackgroundCondition condition) { var foundTask = BackgroundTaskRegistration.AllTasks.FirstOrDefault(x => x.Value.Name == name); if (foundTask.Value != null) return (BackgroundTaskRegistration)foundTask.Value; var builder = new BackgroundTaskBuilder(); builder.Name = name; builder.TaskEntryPoint = taskEntryPoint; builder.SetTrigger(trigger); if (condition != null) builder.AddCondition(condition); return builder.Register(); } 

这就是我所说的:

 BackgroundTaskRegister.Register(nameof(NotificationTask), $"Epguides.Background.{_backgroundTaskName}", new TimeTrigger(30, true), null); 

当我调试我的应用程序并在Visual Studio中使用Lifecycle Events来测试我的后台任务时,一切正常。 所以问题不是任务。

当我检查BackgroundTaskRegistration结果时,我看到属性触发器为null。 在BackgroundTaskRegistration.Trigger的MSDN页面上 ,它说明如下

这不适用于您的代码。 对于所有不受支持的触发器类型,此属性返回的值为null。

因此,根据我的理解,TimeTrigger是一种不受支持的触发器类型,因为Trigger为null。

这是清单文件中声明的内容 声明

是否有人可以解释为什么它不起作用。 我使用的是版本10.0.10586

  1. 您可以使用powershell确认您的任务是否已注册。 打开具有管理权限的powershell,并运行“Get-AppBackgroundTask”。 列出了所有已注册的任务。 如果您无法从列表中找到任务,则注册时会出现一些问题。

  2. 您是否已将后台任务项目添加为主应用程序的参考?

  3. 你有没有调用BackgroundExecutionManager.RequestAccessAsync()? 您应该在注册之前从UI线程调用它。

在此处输入图像描述

  1. 我在商店里有一个带有timetrigger的后台任务的示例应用程序。 它在店面和搜索中隐藏,但您可以从以下链接下载:

https://www.microsoft.com/store/p/ddlgbgtasktrial/9nblggh4s785

这个应用程序注册一个简单的后台任务,间隔时间为15分钟。 此任务只是将debugmessage输出到日志文件。 该应用程序显示一个日志。 如果它运行良好,您可以以大约15分钟的间隔查看调试输出。

我已经确认该应用程序适用于Win10桌面10586.494和移动设备14393.0。

我遇到了与TimeTrigger完全相同的问题(应用程序触发器没有任何问题)我跟踪了MSDN中关于UWP中BackgroundTask的每一步。 但只有在“魔术线”之下帮助我解决 – 感谢@CanolGökel在评论中的回复(我认为它应该得到单独答案):

 BackgroundExecutionManager.RemoveAccess(); // This is the magic line! var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync(); 

时间触发器是UWP后台任务示例 (场景4)的一部分,它正在为我工​​作。 但这条线根本就没用过。 相反,它会在检查过程中用于NFC样本中是否更新了应用程序:

  private static async Task DoBackgroundRequestAccess() { String appVersion = String.Format("{0}.{1}.{2}.{3}", Package.Current.Id.Version.Build, Package.Current.Id.Version.Major, Package.Current.Id.Version.Minor, Package.Current.Id.Version.Revision); if ((string)Windows.Storage.ApplicationData.Current.LocalSettings.Values["AppVersion"] != appVersion) { // Our app has been updated Windows.Storage.ApplicationData.Current.LocalSettings.Values["AppVersion"] = appVersion; // Call RemoveAccess BackgroundExecutionManager.RemoveAccess(); } BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); return status == BackgroundAccessStatus.AlwaysAllowed || status == BackgroundAccessStatus.AllowedSubjectToSystemPolicy; }