Uwp 在用户登录时执行后台任务

本文关键字:执行 后台任务 登录 用户 Uwp | 更新日期: 2023-09-27 18:32:04

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

我已经检查了msdn,似乎我需要背景任务。因此,我按照说明创建和注册了 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 的"声明"选项卡中,System Event选择了属性。

我的IBackgroundTask实现是

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

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

为了确保我在现有项目中添加了第二个BackgroundTask,它每 15 分钟在计时器的基础上调用一次,并执行相同的函数。在第二种情况下,后台任务将按预期注册并执行。

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

我也尝试只使用一种SystemTrigger首先是UserPresent,然后是SessionConnected,但没有成功。

更新 27/01/2016

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

Windows 10

、Windows Server 2016 Technical Preview 和 Windows 10 移动版:无需将应用放置在锁屏上,应用就可以使用此触发器类型成功注册后台任务。

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

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

Uwp 在用户登录时执行后台任务

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

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

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

调用方(

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