Отмена регистрации фоновой задачи закрытого приложения - PullRequest
0 голосов
/ 05 июня 2018

Так как мне нужно передать некоторые значения из моего Приложения в мою BackgroundTask, я использую немного другие настройки для регистрации.Вместо того, чтобы устанавливать EntryPoint, я оставляю его пустым, что позволяет мне передавать значения.Как обычно, я добавил BackgroundTask в мой appxmanifest, однако, без EntryPoint, запуск BackgroundTask запускает OnBackgroundActivation (BackgroundActivationEventArgs args) в App.xaml.cs откуда явызвать пользовательский статический запуск (args.TaskInstance, value1, value2) моего BackgroundTask. Start () принимает недавний TaskInstance, а также пользовательские значения и вызывает пользовательское Run () , которое также принимает пользовательские значения.BackgroundTask выполняется должным образом и, в конце концов, вызывает общий Run () метод моего BackgroundTask, который вызывает GetDeferral.Complete () для обновления моего пользовательского интерфейса, вот как это выглядит в коде.

Моя регистрация в фоновом режиме

public async static Task RegisterMainBackgroundTask()
{
    BackgroundAccessStatus backgroundAccessStatus = await BackgroundExecutionManager.RequestAccessAsync();
    BackgroundTaskBuilder mainTaskBuilder = new BackgroundTaskBuilder
    { Name = "MainTask" };
    mainTaskBuilder.SetTrigger(new TimeTrigger(15, false));
    MainBackgroundTask = mainTaskBuilder.Register();

    if(backgrundAccessStatus == BackgroundAccessStatus.AllowedToSystemPolicy)
        RequestLocationAccess();
    else
        NoAccessNotification();
}

public static void StartupRegisterTasks()
{
    if (MainBackgroundTask != null)
    {
        MainBackgroundTask.Completed -= new BackgroundTaskCompletedEventHandler(BackgroundTaskOnCompleted);
        MainBackgroundTask.Completed += new BackgroundTaskCompletedEventHandler(BackgroundTaskOnCompleted);
    }
}

public static void UnregisterOldBackgroundTasks()=>
    BackgroundTaskRegistration.AllTasks.Where(x => x.Value.Name == "MainTask").ToList().ForEach(x=>x.Value.Unregister(true));

В приложении. Xaml.cs:

protected async override void OnLaunched(LaunchActivatedEventArgs args)
{
    BackgroundTask.LocalBackgroundWorker.UnregisterOldBackgroundTasks();
    Task.Run(async()=>await BackgroundTask.LocalBackgroundWorker.RegisterMainBackgroundTask()).Wait();
    BackgroundTask.LocalBackgroundWorker.StartupRegisterTasks();
}

protected override void OnBackgroundActivated(BackgroundActivatedEventArgs args) =>
    MainBackgroundTask.Start(args.TaskInstance, value1, value2);

В BackgroundTask.cs

public static void Start(IBackgroundTaskInstance taskInstance, Guid client, Guid company) =>
    new MainBackgroundTask().Run(taskInstance, value1, value2);

public void Run(IBackgroundTaskInstance taskInstance, Guid value1, Guid value2)
{
    Task.Run(async () => await RunBackgroundProcess(taskInstance, value1, value2)).Wait();
    Run(taskInstance);
}

private static TransferService.DataTransfer transfer => 
    new TransferService.DataTransfer();
private async Task RunMainBackgroundProcess(IBackgroundTaskInstance taskInstance, Guid value1, Guid value2)
{
    await transfer.SendJob(value1, value2);
    await transfer.UpdateGeoLocation(taskInstance, value1, value2);
}

public void Run(IBackgroundTaskInstance taskInstance) =>
    taskInstance.GetDeferral().Complete();

Моя структура приложения выглядит следующим образом:

  • ProjectSolution
    • BackgroundTask (Содержит BackgroundTask.cs)
    • MyApplication (содержит App.xaml.cs и BackgroundTaskRegistration)
    • TransferService (содержит Transfer.cs)

Пока мойПриложение работает или, по крайней мере, свернуто, мой BackgroundTask работает как положено, но как только приложение закрывается, BackgorundTask превращается в ошибку.К сожалению, единственная информация, которую я получаю, - это unhandlederror.log и слова 2018-06-05T09: 53: 01 ErrorMessage System.NullReferenceException: ссылка на объект не установлена ​​на экземпляр объекта. .

Поскольку я не могу отладить закрытое приложение, я не могу определить, где происходит ошибка.Я думаю, что вызвать TransferService, когда приложение закрыто, невозможно, поэтому я ищу EntryPoint, где я могу отменить регистрацию BackgroundTask, когда он вызывается в первый раз, когда приложение закрыто.UWP не делает различий между приостановкой и закрытием на уровне приложения, поэтому, к сожалению, я не могу отменить ее при закрытии приложения.Любая помощь в решении этой проблемы приветствуется.

...