3

我试图弄清楚为什么后台任务无法启动,但我不知道我做错了什么。

我想做什么:我想要一个自动化的后台任务,它将通过 WebApi 下载 5 个最新项目(数据是几 kB)。下载后会检查本地文件,看是否有新项目可用。如果是这样,我想在 LiveTile 上创建一个带有新项目数量的徽章。

我有以下代码:

private BackgroundTaskRegistration ScheduleBackgroundTask()
{
    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {
        if (cur.Value.Name == "TimeTriggeredTask")
        {
            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    var builder = new BackgroundTaskBuilder();

    builder.Name = "TimeTriggeredTask";
    builder.TaskEntryPoint = "Tasks.UpdateItemTask";
    builder.SetTrigger(new MaintenanceTrigger(15, false));
    builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
    builder.AddCondition(new SystemCondition(SystemConditionType.UserNotPresent));

    BackgroundTaskRegistration task = builder.Register();
    return task;
}

我的工作是这样的:

namespace Tasks
{
    public sealed class UpdateItemTask : IBackgroundTask
    {
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            Debug.WriteLine("Starting");

            BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();

            DataHandler dataHandler = new DataHandler();
            BindableCollection<GeekAndPokeItemViewModel> latestItemsOnline = await dataHandler.GetData("10");
            BindableCollection<GeekAndPokeItemViewModel> latestItemsLocal = await dataHandler.GetLocalData();

            int difference = latestItemsOnline.Except(latestItemsLocal).Count();

            if (difference > 0)
            {
                BadgeUpdateManager.CreateBadgeUpdaterForApplication().Clear();
                BadgeNumericNotificationContent badgeContent = new BadgeNumericNotificationContent((uint)difference);

                // send the notification to the app's application tile
                BadgeUpdateManager.CreateBadgeUpdaterForApplication().Update(badgeContent.CreateNotification());
            }

            _deferral.Complete();
        }
    }
}

在我的 appmanifest 中,backgroundTask 使用任务“计时器”和正确的入口点进行了扩展。

所有代码都在 1 个项目中。

即使附加了调试器(在不启动应用程序的情况下调试程序,并强制触发任务),它也不会命中我的任务(或断点),并且在事件查看器中它会给出以下结果:

具有入口点 Tasks.UpdateItemTask 和名称 TimeTriggeredTask 的后台任务无法激活,错误代码为 0x80010008。

我一直在检查MS 背景任务的样本,但即使是那些也没有帮助。我建议这并不难,但我无法让它发挥作用。

4

1 回答 1

5

我终于让它工作了!

首先:我已将任务作为 Windows RT 组件类型移动到一个新程序集中,并在我的 WinRT 应用程序中添加了一个引用。

第二:我在 1 个 cs 文件中有 BackgroundTaskRegistration 和 UpdateItemTask,只有任务是密封的。我需要将 BackgroundTaskRegistration 也设置为密封,以便编译。一旦我强行触发触发器,它最终会到达断点......

于 2013-03-05T10:20:45.907 回答