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