9

对于 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");
    }

我在清单中添加了这个:

      <Extension Category="windows.backgroundTasks" EntryPoint="MyApp.Pages.SampleBackgroundTask">
      <BackgroundTasks>
        <Task Type="timer" />
      </BackgroundTasks>
    </Extension>

我是不是忘记了什么?

谢谢您的帮助。

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

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

        _deferral.Complete();
    }
}
4

5 回答 5

6

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

于 2012-11-12T03:19:23.943 回答
3

在运行 BackgroundTask 之前,您需要用户权限,您可以手动执行此操作:打开应用程序并单击 Settings Charm 中的 Permissions 并打开 Lock screen 设置。

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

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

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

于 2012-12-27T09:15:11.230 回答
3

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

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

总结一下要求:

  • 'await 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 <myAppPackageGuid> | Remove-AppPackage

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

于 2016-05-05T08:55:44.567 回答
2

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

于 2013-01-27T09:02:09.423 回答
0

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

于 2018-02-27T11:37:35.940 回答