Регистрация фоновой задачи в WinRT
-
21-12-2019 - |
Вопрос
Я пытаюсь зарегистрировать фоновую задачу и наблюдаю странное поведение.Похоже, что сама задача регистрируется и запускается в нужное время;однако, когда он срабатывает, моя программа закрывается (без ошибок).
Подозреваю, что причина связана с тем, что программа у меня не спрашивает, хочу ли я разрешить выполнение фоновой задачи при запуске.Я создал объявление фоновой задачи как системное событие и регистрирую его из App.Xaml.cs следующим образом:
var builder = new BackgroundTaskBuilder();
builder.Name = "NewTask";
builder.TaskEntryPoint = "ConnectionMonitor.CheckInternet";
builder.SetTrigger(new SystemTrigger(SystemTriggerType.InternetAvailable, false));
BackgroundTaskRegistration task = builder.Register();
Итак, я считаю, что мой вопрос:почему бы ему не спросить у меня разрешения на запуск фоновой задачи (которая, как я полагаю, даст мне ответ на мою главную проблему: почему происходит сбой)?
Я не уверен, имеет ли это значение, но это универсальное приложение для Windows (приведенный выше файл app.xaml.cs находится в Shared
проект.
Задача выглядит следующим образом:
BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
bool newConnected = IsConnected();
if (connected != newConnected)
{
connected = newConnected;
var notifier = ToastNotificationManager.CreateToastNotifier();
var template = ToastNotificationManager.GetTemplateContent(ToastTemplateType.ToastText02);
var element = template.GetElementsByTagName("text")[0];
element.AppendChild(template.CreateTextNode(connected ? "Connection available" : "Connection lost"));
var toast = new ToastNotification(template);
notifier.Show(toast);
}
_deferral.Complete();
Решение
Вы спрашивали: почему он не запросил у меня разрешения на запуск фоновой задачи?
Ответ: если ваша фоновая задача не требует доступа к экрану блокировки, для регистрации не требуется разрешение пользователя.По умолчанию пользовательское приглашение отсутствует.Одна из целей этой конструкции заключается в том, что она позволяет вам регистрировать задачу из другой задачи.
В Windows не нужно вызывать BackgroundExecutionManager.RequestAccessAsync()
кроме доступа к экрану блокировки.Вызов предоставит вам больше квоты, но потребует от пользователя одобрения задачи.
В Windows Phone вызов RequestAccessAsync()
требуется несмотря ни на что, но никогда не запрашивает у пользователя пользовательский интерфейс.По этой причине логика вашего универсального приложения может быть общей, но, скорее всего, будет иметь #if
обрабатывать регистрацию по-другому, если это необходимо.