none
Fonction en arrière-plan d'une application RRS feed

  • Question

  • Bonjour à tous :)

    Je voudrais activer une fonction en arrière-plan pour mon application. J'ai tenté de suivre les explications de MSDN et fait ceci :

    Ce code dans default.hml

    function RegisterBackgroundTask(taskEntryPoint, taskName, trigger, condition) {
                // Check for existing registrations of this background task.
                var taskRegistered = false;
    
                var background = Windows.ApplicationModel.Background;
                var iter = background.BackgroundTaskRegistration.allTasks.first();
                var hascur = iter.hasCurrent;
    
                while (hascur) {
                    var cur = iter.current.value;
    
                    if (cur.name === taskName) {
                        taskRegistered = true;
                        break;
                    }
                    hascur = iter.moveNext();
                }
    
                // If the task is already registered, return the registration object.
                if (taskRegistered == true) {
                    return iter.current;
                }
    
                // Register the background task.
                var builder = new background.BackgroundTaskBuilder();
    
                builder.Name = taskName;
                builder.TaskEntryPoint = taskEntryPoint;
                builder.setTrigger(trigger);
    
                if (condition != null) {
                    builder.addCondition(condition);
                }
    
                var task = builder.register;
                return task;
            }
    
    var hourlyTrigger = new Windows.ApplicationModel.Background.TimeTrigger(15, false);
    var userCondition = new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
    Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync();
    var entryPoint = "js\\arriere-plan.js";
    var taskName = "Vérification de mails";
    var task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

    J'ai créé arriere-plan.js avec :

    var cancel = false;
    
    (function () {
        "use strict";
        var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;
        function onCanceled(cancelSender, cancelReason) {
            cancel = true;
        }
        backgroundTaskInstance.addEventListener("canceled", onCanceled);
    
        function doWork() {
            var key = null,
                settings = Windows.Storage.ApplicationData.current.localSettings;
    
            // Mon code ici
    
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Succeeded";
            close();
        }
    
        if (!canceled) {
            doWork();
        } else {
            key = backgroundTaskInstance.task.taskId.toString();
            settings.values[key] = "Canceled";
            close();
        }
    
    })();

    Et enfin j'ai défini dans le manifest une déclaration de "Tache en arrière-plan" avec Minuterie et "js\\arriere-plan.js" en point d'entré.

    Malgré ça, mon code se trouvant dans arriere-plan.js n'est jamais exécuté, même après avoir attendu plus de 15 minutes.
    Ai-je oublié quelque chose pour que ma fonction en arrière-plan fonctionne ?

    Merci d'avance de votre aide :)

    dimanche 1 mars 2015 14:22

Réponses

  • Bonjour,
    J'ai créé un sample simple en partant du code présent sur les tutoriaux de Microsoft.
    En fait il y avait des erreurs :
    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    

    Les noms de propriétés en Javascript sont en camelCasing (donc première lettre en minuscule).
    Il faut alors remplacer par :
    builder.name = taskName;
    builder.taskEntryPoint = taskEntryPoint;
    
    Cordialement,

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse yoanpg lundi 9 mars 2015 07:32
    samedi 7 mars 2015 12:40

Toutes les réponses

  • Bonjour yoanpg,

    Essayez cela: "Diagnostic des erreurs d'activation des tâches en arrière-plan" dans la dernière section de cet article.

    Voici un exemple pour télécharger: Background task sample.

    Merci de nous tenir au courant.

    Cordialement,

    Nina


    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.


    lundi 2 mars 2015 13:23
    Modérateur
  • Bonjour,
    Je vous deux problèmes dans ce que vous nous dites :
    - L'opération de register doit être effectuée une fois que l'accès à l'enregistrement ai été autorisé (j'aurai fais cela) :
    var hourlyTrigger = new Windows.ApplicationModel.Background.TimeTrigger(15, false);
    var userCondition = new Windows.ApplicationModel.Background.SystemCondition(Windows.ApplicationModel.Background.SystemConditionType.internetAvailable);
    Windows.ApplicationModel.Background.BackgroundExecutionManager.requestAccessAsync()
                        .then(function (accessStatus) {
                            if (access == Windows.ApplicationModel.Background.BackgroundAccessStatus.denied
                                || accessStatus == Windows.ApplicationModel.Background.BackgroundAccessStatus.unspecified)
                                return;
    
                            var entryPoint = "js\\arriere-plan.js";
                            var taskName = "Vérification de mails";
                            var task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
                        });

    - Dans votre manifest, il ne faut pas utiliser Entry point pour spécifier votre fichier JS de tâche mais Start page. (Bon OK j'avoue que c'est déroutant :) mais Entry point est utilisé dans le cas d'une tâche compilée dans un assembly). => il s'agit du point qui fait que votre tâche n'est pas exécutée. Plus d'infos :

    - https://msdn.microsoft.com/en-us/library/windows/apps/hh977045.aspx

    - https://code.msdn.microsoft.com/windowsapps/Background-Task-Sample-9209ade9

    Cordialement,

     

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.



    lundi 2 mars 2015 13:54
  • Merci Kévin pour ces infos.

    J'ai fait les modifs, mais ça ne fonctionne toujours pas.
    J'ai tenté de mettre des points d'arrêt dans arriere-plan.js, mais visiblement ça n'y passe jamais.

    Pourtant ça ressemble au background-task-sample de MSDN ...

    mardi 3 mars 2015 21:00
  • Bonjour,
    Lorsque vous lancez l'application en debug, cela ne vous permet pas de debugger dans une tâche asynchrone puisque celle-ci est lancée par un autre processus (géré par le système).
    Par contre vous pouvez la lancer manuellement pour debugger dedans grâce à Visual Studio.

    1. Activez le Debug Location sur votre IDE,

    2. Lancez l'application pour enregistrer votre tâche asynchrone,

    3. Utilisez le debug location pour lancer votre tâche asynchrone.


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    mercredi 4 mars 2015 09:20
  • Je me doutais bien que c'était particulier pour les tâches en arrière-plan.

    J'ai donc essayé de le lancer manuellement avec le debug location. Problème, mon fichier arriere-plan.js n'apparait pas dans la liste. En analysant un peu le code, je me demande si ma tâche est correctement enregistré comme tâche d'arrière plan.

    En effet, d'après le code que tu m'as donné précédemment, la dernière ligne est :

    var task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

    On définit donc une variable task, certes. Mais ne faut-il pas faire quelque chose avec cette variable, pour lui dire de l'exécuter ?

    On va y arriver, j'y crois :)

    jeudi 5 mars 2015 13:02
  • Bonjour,

    Et bien oui, effectivement il manque un morceau dans votre code.

    Tellement il me paraissait évident.

    Dans votre méthode RegisterBackgroundTask modifiez la ligne :

    var task = builder.register;

    En :

    var task = builder.register();

    Ca devrait fonctionner mieux :)

    Cordialement,


    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    jeudi 5 mars 2015 16:43
  • Avec builder.register() j'ai l'erreur d'exécution suivante sur cette ligne :(

    vendredi 6 mars 2015 20:35
  • Bonjour,
    J'ai créé un sample simple en partant du code présent sur les tutoriaux de Microsoft.
    En fait il y avait des erreurs :
    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    

    Les noms de propriétés en Javascript sont en camelCasing (donc première lettre en minuscule).
    Il faut alors remplacer par :
    builder.name = taskName;
    builder.taskEntryPoint = taskEntryPoint;
    
    Cordialement,

    Kevin BEAUGRAND, Modis FRANCE
    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont résolu votre problème.

    • Marqué comme réponse yoanpg lundi 9 mars 2015 07:32
    samedi 7 mars 2015 12:40
  • Super ça marche !! :)
    Merci beaucoup de votre aide Kévin. Il fallait avoir l’œil pour voir l'erreur de majuscule !
    Et merci à MSDN qui donne des exemples de code faux :s

    lundi 9 mars 2015 07:32