【问题标题】:Timetrigger not firing backgroundtask UWPTimetrigger 未触发 backgroundtask UWP
【发布时间】:2016-11-26 09:17:23
【问题描述】:

我和这里的这个人有同样的问题:UWP Timetrigger not working 但我无法评论这个问题,因为我的声誉不够高,所以我正在创建一个新问题。

正如我所说,我有同样的问题。我注册了后台任务,但没有任何反应。我的后台任务位于一个单独的项目(运行时组件)中。所以这不是问题。 这是我注册任务的方法:

public static BackgroundTaskRegistration Register(string name, string taskEntryPoint, IBackgroundTrigger trigger, IBackgroundCondition condition)
    {
        var foundTask = BackgroundTaskRegistration.AllTasks.FirstOrDefault(x => x.Value.Name == name);
        if (foundTask.Value != null)
            return (BackgroundTaskRegistration)foundTask.Value;

        var builder = new BackgroundTaskBuilder();
        builder.Name = name;
        builder.TaskEntryPoint = taskEntryPoint;
        builder.SetTrigger(trigger);
        if (condition != null)
            builder.AddCondition(condition);

        return builder.Register();
    }

我就是这样称呼它的:

BackgroundTaskRegister.Register(nameof(NotificationTask), $"Epguides.Background.{_backgroundTaskName}", new TimeTrigger(30, true), null);

当我调试我的应用程序并使用 Visual Studio 中的生命周期事件来测试我的后台任务时,一切正常。所以问题不在于任务。

当我检查 BackgroundTaskRegistration 结果时,我看到属性触发器为空。在 BackgroundTaskRegistration.Trigger 的 MSDN page 上,它说以下

这不适用于您的代码。对于所有不受支持的触发器类型,此属性返回的值为 null。

所以据我了解,TimeTrigger 是一种不受支持的触发器类型,因为 Trigger 为空。

这是清单文件中声明的内容

有没有人可以解释为什么它不起作用。我正在使用版本 10.0.10586

【问题讨论】:

  • 一件事:'空触发器属性'是我相信的正常行为。我也用timetrigger事件实现了bgtask,调试了很多次,但是属性一直为null,任务运行良好。如果可能,我会发布其他信息作为答案。
  • thread 的最后一个答案对我有用

标签: c# uwp windows-10-universal


【解决方案1】:
  1. 您可以使用 powershell 确认您的任务是否已注册。 使用管理权限打开 powershell,然后运行“Get-AppBackgroundTask”。列出了所有已注册的任务。如果您无法从列表中找到您的任务,则说明注册时存在一些问题。

  2. 您是否添加了后台任务项目作为对您的主应用程序的引用?

  3. 您是否调用了 BackgroundExecutionManager.RequestAccessAsync()?您应该在注册之前从 UI 线程调用它。

  1. 我在商店中有一个带时间触发器的后台任务示例应用程序。它对店面和搜索隐藏,但您可以从以下链接下载:

https://www.microsoft.com/store/p/ddlgbgtasktrial/9nblggh4s785

此应用注册一个简单的后台任务,间隔时间为 15 分钟。此任务只是将调试消息输出到日志文件。该应用程序显示一个日志。如果运行良好,您可以每隔 15 分钟左右看到一次调试输出。

我已确认该应用适用于 Win10 桌面 10586.494 和移动 14393.0。

【讨论】:

  • 缺少的是第 3 点。我看到该任务是通过 powershell 注册的,感谢您的提示。我想知道如何检查注册是否成功。我再次查看 MSDN 以查看有关如何创建和注册后台任务的文章中是否提到了 RequestAsync(link 确实如此。这是一个小注释,但我错过了。我还必须先删除访问权限。谢谢寻求帮助。
  • 嗯。似乎它不起作用。我认为它有效,因为我在通知中心看到了一条消息,但这只是来自测试。关于它为什么不起作用的任何其他想法?
  • 我尝试了示例应用程序并且可以正常工作。我认为这是它被称为的方式。当我直接从 OnNavigatedTo 覆盖上的视图调用时,它可以工作。但是当我从对 onNavigatedToEvent 做出反应的 viewModel 中调用它时,它就不起作用了。为什么要从 UI 线程调用 RequestAsync?
  • 因为 MS 是这么说的。在某些情况下,“RequestAccessAsync”方法会显示 MessageBox 并要求用户批准。此操作可能需要来自 UI 线程的调用。这是我的猜测。
  • 我认为这只是 TimeTrigger 的问题,因为我使用了不同的触发器(SystemTrigger Internet Available)并且它可以工作。但是使用 TimeTrigger 是行不通的
【解决方案2】:

我在使用 TimeTrigger 时遇到了完全相同的问题(应用程序触发器工作时没有任何问题),我遵循了 MSDN regarding BackgroundTask in UWP 的每一步。但只有在“魔术线”下方帮助我解决了 - 非常感谢@Canol Gökel 在 cmets 中的回复(我认为它值得单独回答):

BackgroundExecutionManager.RemoveAccess(); // This is the magic line!
var backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();

时间触发器是 UWP background task sample(场景 4)的一部分,它对我有用。但是这条线根本不在那里使用。相反,它在检查应用程序是否更新期间用于 NFC 示例:

    private static async Task<bool> DoBackgroundRequestAccess()
    {
        String appVersion = String.Format("{0}.{1}.{2}.{3}",
                Package.Current.Id.Version.Build,
                Package.Current.Id.Version.Major,
                Package.Current.Id.Version.Minor,
                Package.Current.Id.Version.Revision);

        if ((string)Windows.Storage.ApplicationData.Current.LocalSettings.Values["AppVersion"] != appVersion)
        {
            // Our app has been updated
            Windows.Storage.ApplicationData.Current.LocalSettings.Values["AppVersion"] = appVersion;

            // Call RemoveAccess
            BackgroundExecutionManager.RemoveAccess();
        }

        BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync();

        return status == BackgroundAccessStatus.AlwaysAllowed
            || status == BackgroundAccessStatus.AllowedSubjectToSystemPolicy;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    相关资源
    最近更新 更多