首页 文章

尝试使用TimeTrigger注册后台任务时'Trigger'属性为null

提问于
浏览
2

我遵循了Microsoft创建和注册后台任务的指导原则:https://msdn.microsoft.com/en-us/library/windows/apps/mt299100.aspx

我有我的主项目,它使用触发器等注册后台任务,以及另一个保存后台任务代码的Windows运行时组件项目,并由我的主项目引用 .

我注册后台任务的代码是:

bool registered = false;
        foreach (var task in BackgroundTaskRegistration.AllTasks)
        {
            if (task.Value.Name == "BackgroundGPS")
            {
                registered = true;
            }
        }

        if (!registered)
        {
            var builder = new BackgroundTaskBuilder();

            builder.Name = "BackgroundGPS";
            builder.TaskEntryPoint = "BackgroundTasks.BackgroundGPSTask";

            BackgroundExecutionManager.RemoveAccess();
            var x = await BackgroundExecutionManager.RequestAccessAsync();
            var trigger = new TimeTrigger(15, false);
            builder.SetTrigger(trigger);

            BackgroundTaskRegistration task = builder.Register();
            //Here trigger property of 'task' is null.
        }
    }

我的后台任务永远不会运行,因为看起来触发器永远不会触发 . 我调试了代码,根据我的评论,BackgroundTaskRegistration变量的触发器属性为null .

现在,我尝试使用SystemTrigger而不是TimeTrigger并且它可以工作,该属性不为null . 我看到触发器属性被描述为“如果触发器类型不受支持则为null” .

为什么TimeTrigger不受支持?我打电话给 RequestAccessAsync() 获取锁屏访问权限,并在允许的情况下返回 . 我've also added '计时器' to the task types of the '后台任务' declaration of my main project' s应用程序清单 . 根据Microsoft的所有建议,TimeTrigger是让后台任务在计时器上运行的唯一方法(MaintenanceTrigger仅在插入电源时才有效) .

关于此,有两个类似的SO问题:

Can't register a Time triggered Background Task

BackgroundTaskRegistration trigger property is null

其中一个没有任何答案,另一个我已经实施过的建议 .

有人能帮忙吗?

1 回答

  • 1

    我认为这是一个文件问题 . backgroundtaskregistration触发器属性在我这边也是null,但时间触发器确实有效 .

    我不知道你是怎么测试它的 . 但是,进行以下测试将表明它确实有效 .

    • 手动卸载您的应用以避免任何意外行为 .

    • 使用非常简单的实现定义后台任务,如下所示 .

    public sealed class BackgroundTask1 : IBackgroundTask
    {
        BackgroundTaskDeferral _deferral;
    
        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            _deferral = taskInstance.GetDeferral();
    
            await ApplicationData.Current.LocalFolder.CreateFileAsync("test.txt"
            , CreationCollisionOption.ReplaceExisting);
    
    
            _deferral.Complete();
        }
    }
    
    • 在Visual Studio中,开始调试您的应用程序 . 注册后台任务后,单击生命周期事件工具栏并选择后台任务,如下所示 . 这将强制后台任务运行 . 拿这个机会来检查是否有任何问题 .
      enter image description here

    • 转到以下文件夹,检查是否可以看到test.txt文件存在 . 将{用户名}替换为已登录用户 . 在Visual Studio中,在设计器中打开项目的package.appxmanifest,切换到打包选项卡,最后一行是,用它替换占位符 .

    C:\ Users \ \ AppData \ Local \ Packages \ \ LocalState

    • 要从视觉工作室进行测试,只需等待15分钟并重复步骤#4 .

相关问题