当前位置: 首页 > 知识库问答 >
问题:

UWP中的后台任务-TimeTrigger和SystemTrigger在Builder.SetTrigger中注册空值

姜鹏程
2023-03-14

我正在尝试设置一个后台任务运行每15分钟从我的UWP应用程序,但尽管应用程序注册成功,它没有被触发。这里有很多关于这方面的资料,所以为了快速总结一下我到目前为止所做的工作:

  1. 已创建Windows运行时组件项目。
  2. 添加了实现IBackgroundTask的BackgroundSync.cs。
  3. 从我的UI项目引用了WinRT项目。
  4. 已在Package.AppManifest中注册后台任务,包括选中的计时器和系统事件触发器框。
  5. 在app.xaml.cs中注册了BackgroundSync,代码如下。
  6. 已验证BackgroundSync是PowerShell中注册的后台任务。
  7. 我在debug>生命周期事件中手动成功触发了BackgroundSync任务。

下面是我注册任务的代码:

    private static async Task<BackgroundTaskRegistration> SetupBackgroundSync()
    {
        await BackgroundExecutionManager.RequestAccessAsync();

        var builder = new BackgroundTaskBuilder();

        var TaskName = "BackgroundSync";

        foreach (var t in BackgroundTaskRegistration.AllTasks)
        {
            if (t.Value.Name == TaskName)
            {
                t.Value.Unregister(true);
            }
        }

        builder.Name = TaskName;
        builder.TaskEntryPoint = typeof(Background.BackgroundSync).FullName;
        builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));

        builder.SetTrigger(new TimeTrigger(15, false));

        BackgroundTaskRegistration task = builder.Register();

        return task;
    }

此后台任务问题的测试项目中的代码:

RegistrationHelper.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;

namespace Tasks
{
    public sealed class RegistrationHelper
    {

        public async Task<BackgroundTaskRegistration> RegisterTasks()
        {
            //Returns AllowedSubjectToSystemPolicy
            await BackgroundExecutionManager.RequestAccessAsync();

            var builder = new BackgroundTaskBuilder();

            var TaskName = "BackgroundTask1";

            foreach (var t in BackgroundTaskRegistration.AllTasks)
            {
                if (t.Value.Name == TaskName)
                {
                    t.Value.Unregister(true);
                }
            }

            builder.Name = TaskName;
            builder.TaskEntryPoint = typeof(BackgroundTask1).FullName;
            builder.AddCondition(new     SystemCondition(SystemConditionType.InternetAvailable));

            builder.SetTrigger(new TimeTrigger(15, false));

            BackgroundTaskRegistration task = builder.Register();

            return task;

        }

    }
}

在这里调用了我的app.xaml.cs。

    public App()
    {
        this.InitializeComponent();
        this.Suspending += OnSuspending;

        Tasks.RegistrationHelper registrationhelper = new Tasks.RegistrationHelper();

        var task = registrationhelper.RegisterTasks();
    }
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.ApplicationModel.Background;

namespace Tasks
{
    public sealed class BackgroundTask1 : IBackgroundTask
    {

        public void Run(IBackgroundTaskInstance taskInstance)
        {

            while (true) { }

        }

    }
}

<Extensions>
    <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTask1">
      <BackgroundTasks>
        <Task Type="systemEvent" />
        <Task Type="timer" />
      </BackgroundTasks>
    </Extension>
  </Extensions>

共有1个答案

许淳
2023-03-14

这可能不是您的解决方案,但有时,我的计时器任务也不会启动,在这种情况下有助于下一步

  1. 在windows设置中禁用对应用程序的后台访问
  2. 重新启动PC
  3. 启用访问
  4. 启动应用程序注册后台任务

此外,您提供的代码有几个可能导致问题的问题点

    null
 类似资料:
  • 本文向大家介绍uwp 取消注册任务,包括了uwp 取消注册任务的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 我正在使用第三方rest api来查询数据并在我的应用程序中显示它。我得在晚上12点左右执行任务。它将执行一个后台任务,从rest api查询数据,并更新live tile和生成通知。我想只使用C#来完成这个任务。我不知道做这个任务最好的方法是什么。但是我使用下面的代码来执行后台任务,这是不起作用的。不知道为什么? 从后台任务中,我正在查询数据并生成toast通知。 任何有关此代码无法工作的原因或

  • 说明 在后台任务中,因为是运行在task进程,所以无法使用协程和协程客户端。如果你要操作数据库或Redis,一定要配置同步的连接池。 配置 项目配置文件中mainServer.configs.task_worker_num一定要配置为大于0,否则无法使用后台任务。 定义任务执行类 <?php namespace Test; use Imi\Task\TaskParam; use Imi\Task

  • 问题内容: 我想知道哪种方法是在Java中实现某种后台任务的最有效方法(我想那将是某种非阻塞线程)。更准确地说- 我有一些Java代码,然后在某个时候需要执行长时间运行的操作。我想做的是在后台执行该操作,以便程序的其余部分可以继续执行,并且当该任务完成时,只需更新一些特定的对象即可。然后,其他组件将检测到此更改。 问题答案: 您应该使用线程池, http://java.sun.com/docs/b

  • 问题内容: 我正在尝试使用Heroku为我的Django应用设置后台任务。 我正在按照Heroku文档中说明的步骤进行操作。但是,我一开始就已经陷入困境。 我已经成功安装了RQ: 我创建了文件,其中包含与文档中完全相同的代码。 但是,当我尝试运行时: 我收到以下错误: 经过研究,我意识到没有配置。我现在已经安装了,并且在运行时可以找到它。不幸的是,这似乎并不是我做错的唯一事情,因为我仍然遇到相同的

  • 问题内容: 我有一个Django网站,并且一个页面上有一个按钮(或链接),单击该按钮将启动一个运行时间较长的任务。显然,我想将此任务作为后台任务启动,并立即将结果返回给用户。我想使用一种简单的方法来实现此目的,该方法不需要我安装和学习例如Celery这样的全新消息传递体系结构。我不想用celery!我只想使用一种简单的方法,就可以在接下来的半小时左右的时间内进行设置并开始运行。在Django中没有