Surveiller la progression et l’achèvement des tâches en arrière-plan

[ Mise à jour pour les applications UWP sur Windows 10. Pour les articles sur Windows 8.x, voir l’archive. ]

API importantes

Découvrez comment votre application peut reconnaître la progression et l’achèvement signalés par une tâche en arrière-plan qui s’exécute hors processus. (Pour les tâches en arrière-plan in-process, vous pouvez définir des variables partagées pour signaler la progression et l’achèvement.)

La progression et l’achèvement des tâches en arrière-plan peuvent être surveillés par le code de l’application. Pour ce faire, l’application s’abonne aux événements des tâches en arrière-plan qu’elle a inscrites auprès du système.

Créer un gestionnaire d’événements pour gérer les tâches en arrière-plan achevées

  1. Créez une fonction de gestionnaire des événements pour gérer les tâches en arrière-plan achevées. Ce code doit suivre une empreinte spécifique, qui accepte un objet IBackgroundTaskRegistration et un objet BackgroundTaskCompletedEventArgs.

    Utilisez l’empreinte suivante pour la méthode de gestionnaire des événements de tâche en arrière-plan OnCompleted :

     private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
     {
         // TODO: Add code that deals with background task completion.
     }
    
     auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
     {
         // TODO: Add code that deals with background task completion.
     };
    
  2. Ajoutez du code au gestionnaire des événements qui traite l’achèvement des tâches en arrière-plan.

    Par exemple, l’exemple de tâche en arrière-plan met à jour l’interface utilisateur.

        private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
        {
            UpdateUI();
        }
    
        auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
        {    
            UpdateUI();
        };
    

Créer une fonction de gestionnaire des événements pour gérer la progression des tâches en arrière-plan

  1. Créez une fonction de gestionnaire des événements pour gérer les tâches en arrière-plan achevées. Ce code doit suivre une empreinte spécifique, qui accepte un objet IBackgroundTaskRegistration et un objet BackgroundTaskProgressEventArgs.

    Utilisez l’empreinte suivante pour la méthode de gestionnaire des événements de tâche en arrière-plan OnProgress :

        private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
        {
            // TODO: Add code that deals with background task progress.
        }
    
        auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
        {
            // TODO: Add code that deals with background task progress.
        };
    
  2. Ajoutez du code au gestionnaire d’événements qui traite l’achèvement des tâches en arrière-plan.

    Ainsi, l’exemple de tâche en arrière-plan met à jour l’interface utilisateur conformément à l’état de progression transmis avec le paramètre args :

        private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
        {
            var progress = "Progress: " + args.Progress + "%";
            BackgroundTaskSample.SampleBackgroundTaskProgress = progress;
    
            UpdateUI();
        }
    
        auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
        {
            auto progress = "Progress: " + args->Progress + "%";
            BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
    
            UpdateUI();
        };
    

Inscrire les fonctions de gestionnaire d’événements auprès des tâches en arrière-plan nouvelles et existantes

  1. Lorsque l’application inscrit une tâche en arrière-plan pour la première fois, elle doit s’inscrire pour recevoir les mises à jour de progression et d’achèvement de la tâche au cas où celle-ci s’exécuterait pendant que l’application est toujours active au premier plan.

    Ainsi, l’exemple de tâche en arrière-plan appelle la fonction suivante pour chaque tâche en arrière-plan qu’il inscrit :

        private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
        {
            task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
            task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
        }
    
        void SampleBackgroundTask::AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration^ task)
        {
            auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
            {
                auto progress = "Progress: " + args->Progress + "%";
                BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
                UpdateUI();
            };
    
            task->Progress += ref new BackgroundTaskProgressEventHandler(progress);
    
    
            auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
            {
                UpdateUI();
            };
    
            task->Completed += ref new BackgroundTaskCompletedEventHandler(completed);
        }
    
  2. Lorsque l’application se lance ou accède à une nouvelle page dans laquelle l’état des tâches en arrière-plan est important, elle doit obtenir la liste des tâches en arrière-plan actuellement inscrites et les associer aux fonctions de gestionnaire des événements de progression et d’achèvement. Cette liste est conservée dans la propriété BackgroundTaskRegistration.AllTasks.

    Ainsi, l’exemple de tâche en arrière-plan utilise le code suivant pour joindre les gestionnaires d’événements lorsque vous accédez à la page SampleBackgroundTask :

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            foreach (var task in BackgroundTaskRegistration.AllTasks)
            {
                if (task.Value.Name == BackgroundTaskSample.SampleBackgroundTaskName)
                {
                    AttachProgressAndCompletedHandlers(task.Value);
                    BackgroundTaskSample.UpdateBackgroundTaskStatus(BackgroundTaskSample.SampleBackgroundTaskName, true);
                }
            }
    
            UpdateUI();
        }
    
        void SampleBackgroundTask::OnNavigatedTo(NavigationEventArgs^ e)
        {
            // A pointer back to the main page.  This is needed if you want to call methods in MainPage such
            // as NotifyUser()
            rootPage = MainPage::Current;
    
            //
            // Attach progress and completed handlers to any existing tasks.
            //
            auto iter = BackgroundTaskRegistration::AllTasks->First();
            auto hascur = iter->HasCurrent;
            while (hascur)
            {
                auto cur = iter->Current->Value;
    
                if (cur->Name == SampleBackgroundTaskName)
                {
                    AttachProgressAndCompletedHandlers(cur);
                    break;
                }
    
                hascur = iter->MoveNext();
            }
    
            UpdateUI();
        }