1

我刚刚从https://code.msdn.microsoft.com/windowsapps/Background-Task-Sample-9209ade9下载了示例 并尝试运行 windows phone 8.1 项目。程序运行,但即使我进行更改以触发事件,也没有发生后台任务。我也不认为它已注册为作为后台任务运行,因为我没有收到任何将应用程序添加到锁定屏幕的请求。而且我无法手动将应用程序添加到锁定屏幕。注意:将 Lumia 730 与 8.1 Denim 搭配使用。

我还尝试自己编写一个示例程序,使用 silverlight 8.1 和背景作为 RT 组件。

if (BackgroundTaskRegistration.AllTasks.Any(task => task.Value.Name == name))
            {
                // One register it once
                return;
            }
    var builder = new BackgroundTaskBuilder();
                var trigger = new SystemTrigger(SystemTriggerType.UserAway, false);
                builder.Name = name;
                builder.TaskEntryPoint = typeof(MyBackgroundTask.BackClass).FullName;                   builder.SetTrigger(trigger);

                await BackgroundExecutionManager.RequestAccessAsync();
                BackgroundTaskRegistration registration = builder.Register();
                registration.Completed += RegistrationOnCompleted;

在这里,我也遇到了异常

        BackgroundTaskRegistration registration = builder.Register();

例外是运行时状态

> A first chance exception of type 'System.Exception' occurred in
> Project1.DLL
4

4 回答 4

2

我找到了这个问题的解决方案:

  1. 为后台任务制作运行时 Windows Phone 8.1 项目

Windwos 电话后台任务

  1. 在后台任务项目中注册任务时:

    public async static void Register()
    {
        Debug.WriteLine("Registering geofence bg task");
        if (!IsTaskRegistered())
        {
            var result = await BackgroundExecutionManager.RequestAccessAsync();
            var builder = new BackgroundTaskBuilder();
    
            builder.Name = TaskName;
            builder.TaskEntryPoint = typeof(BackgroundTask.YourTaskName).FullName;
            builder.SetTrigger(new LocationTrigger(LocationTriggerType.Geofence));
            try
            {
                builder.Register();
                Debug.WriteLine("GeoFence Task Registered");
            }
            catch (Exception ex)
            {
                Debug.WriteLine("GeoFence Task Failed : " + ex.Message.ToString());
            }
    
    
    
        }
        else { }
    
    }
    

确保通过将 TaskEntryPoint 引用到后台项目名称来正确添加它,它看起来像这样:“BackgroundTask.YourTaskName”

  1. builder.Name 参数的 TaskName 字符串应如下所示:

    静态字符串 TaskName = "BackgroundTask.YourTaskName";

  2. 在声明选项卡下的 appmanifest 中声明您的 TaskEntryPoint,这里我使用 GeofenceTask,所以我检查了任务所需的几个复选框:

Windwos手机后台任务2

在这里你再次输入 EntryPoint(like TaskEntryPoint) : "BackgroundTask.YourTaskName"

  1. 当您在应用程序中的某处初始化任务时,您使用:

    BackgroundTask.YourTaskName.Register();

这都是关于任务的入口点。因此,如果您将任务放在应该完成的单独项目下,则必须在其下输入该项目的名称和后台任务类的名称。

不要只为您的入口点单独使用后台任务类名称,您必须使用包含该类的项目名称来引用它。

希望能帮助到你,

于 2015-03-11T12:53:18.933 回答
1

You don't mention what the exception is, nor what the text accompanying it is. This makes it hard to answer.

Nevertheless, assuming your error is "Class not registered" you need to do several things:

  1. Make sure MyBackgroundTask.BackClass is a class in a Windows Runtime Component project (it can't be in your Silverlight project)
  2. Make sure you reference that project (you'll get compiler errors if you don't)
  3. Make sure you've correctly added a Background Task entry in the Package.appxmanifest designer, on the Declarations tab. Use the class name again as the Entry point
于 2015-02-12T06:35:49.870 回答
0

好吧,我尝试在后台任务中添加 BackgroundTaskDeferral 并开始工作。我想知道为什么这只能保证异步调用。无论如何,它对我有用。谢谢您的帮助

于 2015-02-21T14:45:37.077 回答
0

同样的问题。原来我在 Package.appxmanifest 中的入口点参数拼写为“Module:EntryPoint”而不是“Module.EntryPoint”。我所要做的就是将冒号改为句号。

于 2015-07-28T16:50:35.697 回答