В предыдущем посте мы создали и настроили фоновую задачу для нашего приложения Windows 8: мы создали отдельный проект для этой задачи и настроили файл манифеста. Теперь пришло время написать код на клиенте, чтобы зарегистрировать фоновое задание, чтобы приложение могло им воспользоваться. Мы собираемся зарегистрировать фоновую задачу, созданную в предыдущем посте: задачу на основе таймера, которая просто отображает всплывающее уведомление.
Вот код, который мы вставляем в файл MainPage.xaml.cs , который является кодом первой страницы, которая загружается при запуске приложения.
private async void RegisterBackgroundTask() { try { BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); if (status == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity || status == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity) { bool isRegistered = BackgroundTaskRegistration.AllTasks.Any(x => x.Value.Name == "Notification task"); if (!isRegistered) { BackgroundTaskBuilder builder = new BackgroundTaskBuilder { Name = "Notification task", TaskEntryPoint = "BackgroundTask.NotificationTask.NotificationTask" }; builder.SetTrigger(new TimeTrigger(60, false)); builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable)); BackgroundTaskRegistration task = builder.Register(); } } } catch (Exception ex) { Debug.WriteLine("The access has already been granted"); } }
Первое , что мы делаем , это спросить у пользователя разрешение на запуск фоновой задачи путем вызова Metod RequestAccesAsync из BackgroundExecutionManager класса. Когда этот метод вызывается, отображается диалоговое окно, и пользователь может выбрать, хочет ли он включить задачу или нет: выбор возвращается методом, встроенным в перечислитель BackgroundAccessStatus . Вы сразу заметите, что весь код встроен в оператор try / catch : это необходимо из-за ошибки в WinRT API, которая возвращает исключение в случае, если пользователь уже принял запуск фоновой задачи.
Если пользователь подтвердил выполнение задачи, мы осуществляем поиск, если она уже зарегистрирована в операционной системе. В отличие от Windows Phone, на самом деле одну и ту же задачу можно зарегистрировать несколько раз: вместо Windows Phone вы получите исключение. Чтобы выполнить эту задачу, мы получаем доступ к коллекции всех зарегистрированных задач ( BackgroundTasksRegistration.AllTasks ) и ищем задачу с именем Notification task: позже вы увидите, что это имя мы задали для нашей задачи.
Если задача еще не зарегистрирована, мы продолжаем и регистрируем ее: мы создаем новый объект BackgroundTaskBuilder и устанавливаем два свойства: Имя , которое является идентификатором задачи (это то, которое мы использовали ранее, чтобы проверить, если оно уже зарегистрирован или нет), и TaskEntryPoint , то же значение, которое мы установили в параметре точки входа манифеста: это полное имя класса, в котором размещена фоновая задача, плюс пространство имен. В нашем примере точкой входа является BackgroundTask.NotificationTask.NotificationTask.
Теперь пришло время определить тип фоновой задачи, которую мы собираемся зарегистрировать: мы делаем это с помощью метода SetTrigger объекта BackgroundTaskBuilder . Поскольку в этом примере мы собираемся создать задачу таймера, мы устанавливаем новый TimeTrigger и решаем запускать его каждые 60 минут. Фоновые задачи в Windows 8 также поддерживают условия , которые являются отличным способом убедиться, что задача выполняется только при соблюдении одного или нескольких критериев: в этом примере, поскольку мы собираемся смоделировать фоновую задачу, которая периодически проверяет некоторые новости, мы добавляем SystemCondition типа InternetAvailable.Таким образом, мы можем избежать проверки фоновой задачи, если есть активное подключение к Интернету, потому что, если это не так, задача не будет выполнена вообще.
В конце мы регистрируем задачу, вызывая метод Register . И последнее, но не менее важное: нам нужно добавить ссылку на проект фоновой задачи для клиента: давайте щелкните правой кнопкой мыши на клиентском проекте, выберите « Добавить ссылку» и, используя вкладку « Решения », дважды щелкните на проекте фоновой задачи.
Время отлаживать!
Мы создали фоновую задачу, но как мы можем ее отладить? Очевидно, что Visual Studio 2012 предлагает более умный способ, чем просто ожидание выполнения условия (в нашем примере подключение к Интернету доступно и время срабатывания 60 минут достигнуто). Сначала мы должны зарегистрировать задачу при запуске приложения: в этом примере мы собираемся вызвать метод RegisteredBackgroundTask, который мы только что определили при инициализации MainPage , поэтому мы вызываем его в конструкторе.
При первом запуске приложения вы увидите диалоговое окно с запросом разрешения на запуск в фоновом режиме: подтвердите его и после запуска приложения вернитесь в Visual Studio. Теперь щелкните правой кнопкой мыши на одном из пустых мест рядом с панелями инструментов и выберите отображение панели инструментов « Отладка» . Рядом с названием процесса вы найдете раскрывающееся меню с некоторыми полезными опциями, которые позволят вам моделировать различные состояния жизненного цикла приложения ( Suspend , Resume или Suspend и shutdown ): в нашем случае, так как мы зарегистрировали В фоновой задаче вы увидите еще одну опцию с названием нашей фоновой задачи, которая называется « Уведомление».
Нажмите на нее и… вуаля, ваша фоновая задача будет выполнена: если вы установите точку останова в методе Run проекта фоновой задачи, вы увидите, что она запущена, и вы сможете отладить ее, как обычно с другим приложением.
А если это не сработает? Вот некоторые общие вещи, которые нужно проверить на случай возникновения проблем:
- Убедитесь, что тип проекта фоновой задачи — Компонент времени выполнения Windows.
- У клиента должна быть ссылка на проект фоновой задачи: проверьте дерево ссылок проекта вашего клиента.
- Проверьте настройки приложения (используя значок настройки на панели чудо-кнопок) и убедитесь, что включены как уведомления, так и фоновые задачи.
- Убедитесь, что точка входа правильная, как в манифесте, так и в коде. Это должно быть имя класса с префиксом полного пространства имен.
Если вы хотите поиграть с фоновыми задачами, вот ссылка на скачивание примера проекта, используемого в этом руководстве.