Uwp在用户登录时执行backgroundtask

我正在学习win10 uwp,我的目标是在用户登录时执行操作,例如更新磁贴。

我已经检查了msdn,似乎我需要一个BackgroundTask。 所以我按照说明创建并注册了https://msdn.microsoft.com/en-us/library/windows/apps/mt299100.aspx和相关页面上的后台任务。

BackgroundTaskBuilder taskBuilder= new BackgroundTaskBuilder(); taskBuilder.Name = "TaskClassName"; taskBuilder.TaskEntryPoint = "TaskNameSpace.TaskClassName"; // set conditions (execute when user become present) taskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.SessionConnected, false)); taskBuilder.SetTrigger(new SystemTrigger(SystemTriggerType.UserPresent, false)); var registration= taskBuilder.Register(); 

我的BackgroundTask命名空间和类放在同一解决方案下的一个独立项目中,并添加到Package.appxmanifest的Declaration选项卡中,并选择了属性System Event

我的IBackgroundTask实现是

  public void Run(IBackgroundTaskInstance taskInstance) { BackgroundTaskDeferral deferral = taskInstance.GetDeferral(); UpdateMyTile(); deferral.Complete(); } 

在使用visual studio进行调试时,代码运行相关并更新磁贴,因此我认为我的问题在于如何注册任务而不是在任务实现中。

为了确保我已经向现有项目添加了第二个BackgroundTask ,它每15分钟基于计时器调用并执行相同的function。 在第二种情况下,后台任务已注册并按预期执行。

 BackgroundTaskBuilder taskBuilderT= new BackgroundTaskBuilder(); taskBuilderT.Name = "TaskClassNameTimer"; taskBuilderT.TaskEntryPoint = "TaskNameSpace.TaskClassNameTimer"; taskBuilderT.SetTrigger(new TimeTrigger(15, false)); var registration= taskBuilderT.Register(); 

我还尝试过只使用一个SystemTriggerUserPresent ,然后使用SessionConnected但没有成功。

2016年1月27日更新

@Jakie:不,我没有使用BackgroundExecutionManager.RequestAccessAsync(); 因为在SessionConnected和UserPresent的https://msdn.microsoft.com/EN-US/library/windows/apps/windows.applicationmodel.background.systemtriggertype.aspx上说

Windows 10,Windows Server 2016 Technical Preview和Windows 10 Mobile:在应用程序使用此触发器类型成功注册后台任务之前,您无需在锁定屏幕上放置应用程序。

我将尝试看看这是否会改变当前的行为。 我已经添加了对BackgroundExecutionManager.RequestAccessAsync();调用BackgroundExecutionManager.RequestAccessAsync(); ,使用Windows 10没有显示任何对话框,但它已返回AllowedMayUseActiveRealTimeConnectivity但重启后未在登录时调用任务。

我已经启动了诊断日志并找到了与我的后台任务相关的事件,它已正确注册但随后被取消。 事件报告说eventID 19任务100.我不知道在哪里搜索有关这些代码含义的信息,有什么建议吗?

我终于设法在用户登录时成功更新了一个磁贴。 除了在我的问题中已经描述的操作之外,我已经将任务注册的方法移动到声明后台任务类的同一个项目中。

我创建了一个包含名为BackgroundRegistration的注册方法的类,该类需要sealed 。 我已经将注册方法声明为static但这不是绝对必要的。

我还成功地在启动用户登录时运行我的后台任务,只有在IBackgroundTask run方法实现中调用的所有方法都包含在具有后台任务的项目中并且使用的类被sealed 。 在所有其他情况下,我发现我的后台任务总是返回错误0x80010008,在MS-ERREF中描述为:

当被叫方(服务器)正在处理呼叫时,呼叫方(客户端)消失。