无法注册时间触发的后台任务

对于Windows 8应用程序,在C#/ Xaml中我尝试注册后台任务。 这很难说,但我想我的后台任务已被注册,但当我在调试位置工具栏上点击后台任务的名称时,我的应用程序停止工作,没有任何消息。

我查看了事件查看器上的日志,得到:“具有入口点MyApp.Pages.SampleBackgroundTask和名称示例每小时后台任务的后台任务无法激活,错误代码为0x80010008。”

这是我的代码:

private async void Button_Click_BackgroundTask(object sender, RoutedEventArgs e) { string entryPoint = "MyApp.Pages.SampleBackgroundTask"; string taskName = "Example hourly background task"; TimeTrigger hourlyTrigger = new TimeTrigger(60, false); BackgroundTaskRegistration myBackGroundTaskRegistration = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, null); if(myBackGroundTaskRegistration != null) AttachProgressAndCompletedHandlers(myBackGroundTaskRegistration); } public static BackgroundTaskRegistration RegisterBackgroundTask(String taskEntryPoint, String name, IBackgroundTrigger trigger, IBackgroundCondition condition) { var taskRegistered = false; var iter = Windows.ApplicationModel.Background.BackgroundTaskRegistration.AllTasks; foreach (var item in iter) { var task = item.Value; if (task.Name == name) { taskRegistered = true; return item.Value as BackgroundTaskRegistration; } } var builder = new BackgroundTaskBuilder(); builder.Name = name; builder.TaskEntryPoint = taskEntryPoint; builder.SetTrigger(trigger); if (condition != null) { builder.AddCondition(condition); } BackgroundTaskRegistration taskBack = builder.Register(); return taskBack; } private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task) { task.Progress += new BackgroundTaskProgressEventHandler(OnProgress); task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); } private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args) { var progress = "Progress: " + args.Progress + "%"; } private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args) { Debug.WriteLine("Hi"); } 

我在清单中添加了这个:

       

我忘记了什么吗?

谢谢您的帮助。

编辑:这是我的任务的代码,在我的项目页面之一:

  public sealed class SampleBackgroundTask : IBackgroundTask { public void Run(IBackgroundTaskInstance taskInstance) { BackgroundTaskDeferral _deferral = taskInstance.GetDeferral(); _deferral.Complete(); } } 

我也有这个问题。 我在同一个项目中也有我的。 我终于通过将任务转移到一个单独的项目中来实现它。 我不得不将项目输出设置为Windows运行时组件(在属性应用程序选项卡下)。 另外不要忘记添加项目作为参考。

您需要用户权限才能运行BackgroundTask,您可以手动执行此操作:打开应用程序并单击“设置超级按钮”中的“权限”并将“锁定”屏幕设置设置为“打开”。

您还可以在第一个屏幕加载时提示用户:

 BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); 

毋庸置疑,后者将带来更好的用户体验。

两年后,现在WinRT在Windows 10中,Visual Studio 2015.再次,同样的问题。

提问者表示他们的后台任务是在同一个项目中。 这是行不通的: 这里有关于后台任务的非常全面的文章。 此外,正如Tim指出的那样,必须首先调用BackgroundExecutionManager.RequestAccessAsync()。 但是从8.1开始,当省略时, 后台任务注册在这种情况下将失败 ,因此您永远不会到达任务触发器失败的位置。

总结要求:

  • ‘首先等待BackgroundExecutionManager.RequestAccessAsync()’
  • 任务类必须位于Windows运行时组件项目中
  • 必须在调用应用程序中引用Windows运行时组件项目
  • 必须在应用程序的清单中声明任务类,如上所示,具有完整的命名空间名称
  • Windows运行时组件项目和使用它的应用程序必须以相同的Windows版本为目标。 Visual Studio中的解决方案资源管理器 – >右键单击项目 – >属性 – >应用程序。 库选项卡 – >目标 – >目标和目标版本。

在我的例子中,我确实完成了所有这些,但任务不会被触发。 调试跟踪显示“程序'[0x72C] backgroundTaskHost.exe已退出代码1”,调试器中断了ExecutionEngineException,以及目标机器的事件日志(应用程序和服务日志 – > Microsoft – > Windows – > BackgroundTaskInfrastructure – > Operational)列出了各种创意完全无证的windows错误代码:

“具有入口点和名称的后台任务无法激活,错误代码为0x8007001F(分别为0x800706BE / 0x80131509)。”

失败是不稳定的:起初,它们只是很少发生,并且在几个连续的程序运行中变得更糟,直到后台任务再也没有被调用。

当后台任务的命名空间名称发生更改时(在所有任务注册,包清单和代码中),这首先修复了错误,然后随着时间的推移也变得更糟。

这种情况下的特殊情况是应用程序是在远程目标机器上开发的,并使用远程调试器进行调试。 在每个调试器运行之前删除应用程序包以消除错误。

因此,运行后台任务(0x8007001F / 0x800706BE / 0x80131509)时出现的这些错误似乎与未正确查找已注册的任务有关。 确保正确取消注册任务并在运行新修改之前删除应用程序包可能会有所帮助。 Powershell命令:

 Get-AppPackage | where name -eq  | Remove-AppPackage 

只是在这里记录这个,以防有人遇到同样的问题。

在参考和重建时将您的后台任务项目添加到主项目中。 它会工作

我在编写后台任务时遇到的问题是在设置 – >隐私 – >后台应用程序的Windows 10中,我必须启用允许应用程序在后台运行的选项。 希望这有助于某人!