Вопрос

Я пытаюсь зарегистрировать фоновую задачу и наблюдаю странное поведение.Похоже, что сама задача регистрируется и запускается в нужное время;однако, когда он срабатывает, моя программа закрывается (без ошибок).

Подозреваю, что причина связана с тем, что программа у меня не спрашивает, хочу ли я разрешить выполнение фоновой задачи при запуске.Я создал объявление фоновой задачи как системное событие и регистрирую его из 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 обрабатывать регистрацию по-другому, если это необходимо.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top