2016-11-24 1 views
1

Je souhaite étendre mon application UWP actuelle par une tâche d'arrière-plan. Le in-process model correspond parfaitement à mes besoins car je n'ai pas besoin de beaucoup changer de l'application pour utiliser la tâche d'arrière-plan. Cependant, il y a un problème. La version minimale du SDK est définie sur 10586 pour le moment, mais les tâches en arrière-plan en cours de traitement ne sont disponibles que pour la version SDK 14393 et ​​ultérieure.Utiliser les tâches d'arrière-plan en cours avec SDK version 10586

Normalement, j'utiliserais une clause if «normale» pour vérifier si la fonctionnalité est supportée en utilisant l'espace de noms Windows.Foundation.Metadata.ApiInformation. Malheureusement, comme je surcharge la méthode OnBackgroundActivated, ce n'est pas possible. Honnêtement, je ne veux pas laisser tomber le soutien 10586, du moins pas en ce moment.

Existe-t-il un moyen facile d'enregistrer des tâches en arrière-plan en cours de traitement tout en conservant la prise en charge de 10586?

EDIT: Comme je l'ai demandé dans un commentaire (maintenant supprimé): Non, je n'ai pas encore exécuté l'application sur la build 10586, car ma connexion Internet est sacrément lente. Je demande, parce que Visual Studio ne construira pas l'application quand je placerai la version cible à 10586.

+0

Votre application peut-elle fonctionner sans tâche sur l'ancienne version? La solution simple ici est simplement d'utiliser une tâche hors processus. Pas si grave. –

+0

Il peut. Cependant, il faudrait beaucoup de refactoring, car j'ai besoin de sauvegarder les informations d'identification/paramètres dans un fichier texte pour y accéder de l'extérieur. –

Répondre

1

La méthode OnBackgroundActivated que vous substitue n'est pas le problème ici, car sur 10586 il n'a tout simplement jamais été appelé. Pour créer le projet pour les deux versions dans les propriétés de votre projet définir les versions cibles comme celle-ci: Target versions in Applications tab

Ce qui causeront des ennuis appelle BackgroundExecutionManager.RequestAccessAsync();. Cet appel de méthode utilisé sur 10586 s'attend à ce que vous ayez une BackgroundTask définie dans votre Package.appxmanifest que vous n'avez pas dans votre cas, car elle n'est pas requise selon le documentation. Ainsi, afin de réutiliser le code changer votre méthode enregistrer votre BackgroundTask en cours à quelque chose comme ceci:

public static async Task<bool> RegisterInProcessBackgroundTask(string taskName, uint time = 30) { 
    try { 
     await BackgroundExecutionManager.RequestAccessAsync(); 

     BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder(); 
     taskBuilder.Name = taskName; 
     taskBuilder.SetTrigger(new TimeTrigger(time, false)); 
     BackgroundTaskRegistration registration = taskBuilder.Register(); 

     return true; 
    } catch { 
     return false; 
    } 
} 

Cela fonctionne sur 14393+ et le retour true parce que la tâche a été enregistré avec succès et revenir false après l'exception attrapant car ce type de tâche n'est pas pris en charge sur 10586.