Фоновые задачи Windows Phone 8.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

person AbsoluteSith    schedule 12.02.2015    source источник


Ответы (4)


Я нашел решение для этой проблемы:

  1. Создание проекта Windows Phone 8.1 во время выполнения для фоновой задачи

Фоновая задача телефона Windwos

  1. При регистрации Task внутри вашего проекта фоновой задачи:

    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. Строка TaskName для параметра builder.Name должна выглядеть так:

    статическая строка TaskName = "BackgroundTask.YourTaskName";

  2. Объявите свою TaskEntryPoint в манифесте приложения на вкладке объявления, здесь я использую GeofenceTask, поэтому я установил несколько флажков, необходимых для задачи:

Windwos Phone Background Task 2

Здесь вы снова вводите EntryPoint (например, TaskEntryPoint): «BackgroundTask.YourTaskName»

  1. Когда вы инициализируете задачу где-то в приложении, где вы это делаете, вы используете:

    BackgroundTask.ИмяВашейЗадачи.Регистрация();

Все дело в точке входа задачи. Поэтому, если у вас есть задача в отдельном проекте, как это должно быть сделано, вы должны ввести имя этого проекта и имя класса фоновой задачи под ним.

Не используйте только имя класса фоновой задачи для EntryPoint, вы должны ссылаться на него с именем проекта, который содержит этот класс.

Надеюсь, поможет,

person RandomBoy    schedule 11.03.2015

Вы не упоминаете, что такое исключение, и какой текст его сопровождает. Это затрудняет ответ.

Тем не менее, если ваша ошибка «Класс не зарегистрирован», вам нужно сделать несколько вещей:

  1. Убедитесь, что MyBackgroundTask.BackClass является классом в проекте компонента среды выполнения Windows (он не может быть в вашем проекте Silverlight).
  2. Убедитесь, что вы ссылаетесь на этот проект (в противном случае вы получите ошибки компилятора)
  3. Убедитесь, что вы правильно добавили запись фоновой задачи в конструкторе Package.appxmanifest на вкладке Declarations. Снова используйте имя класса в качестве точки входа.
person Peter Torr - MSFT    schedule 12.02.2015
comment
Извини за это. Но я считаю, что есть какая-то проблема с настройками телефона, так как я могу протестировать программу в эмуляторе, и она работает нормально. Все еще интересно, как мне запустить приложение на моем телефоне - person AbsoluteSith; 12.02.2015
comment
Нет ли больше информации в исключении, если вы развернете или посмотрите на окно вывода? Часто имеется более подробное описание. Возможно, у вас включен режим энергосбережения? Уже установлено много фоновых задач? Вы пробовали другой телефон? - person Peter Torr - MSFT; 13.02.2015

Что ж, я попытался добавить BackgroundTaskDeferral в свою фоновую задачу, и она начала работать. Интересно, почему, поскольку это гарантирует только асинхронный вызов. Во всяком случае, это сработало для меня. Спасибо за помощь

person AbsoluteSith    schedule 21.02.2015

Та же проблема. Оказалось, что параметр точки входа в Package.appxmanifest был записан как «Module:EntryPoint», а не как «Module.EntryPoint». Все, что мне нужно было сделать, это заменить двоеточие на точку.

person LionelGoulet    schedule 28.07.2015