Surveiller la progression et l’achèvement des tâches en arrière-plan
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 signer 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 de la ou des tâches en arrière-plan qu’elle a inscrites auprès du système.
- Cette rubrique part du principe que vous disposez d’une application qui inscrit des tâches en arrière-plan. Pour commencer à créer rapidement une tâche en arrière-plan, consultez Créer et inscrire une tâche en arrière-plan in-process ou Créer et inscrire une tâche en arrière-plan hors processus. Pour plus d’informations détaillées sur les conditions et les déclencheurs, consultez Prendre en charge votre application avec des tâches en arrière-plan.
Créer un gestionnaire d’événements pour gérer les tâches en arrière-plan terminées
Étape 1
Créez une fonction de gestionnaire d’événements pour gérer les tâches en arrière-plan terminées. Ce code doit suivre une empreinte spécifique, qui prend un objet IBackgroundTaskRegistration et un objet BackgroundTaskCompletedEventArgs.
Utilisez l’empreinte suivante pour la méthode du gestionnaire d’é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](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* 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.
};
Étape 2
Ajoutez du code au gestionnaire d’événements qui traite de l’achèvement de la tâche 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](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
UpdateUI();
} };
auto completed = [this](BackgroundTaskRegistration^ task, BackgroundTaskCompletedEventArgs^ args)
{
UpdateUI();
};
Créer une fonction de gestionnaire d’événements pour gérer la progression des tâches en arrière-plan
Étape 1
Créez une fonction de gestionnaire d’événements pour gérer les tâches en arrière-plan terminées. Ce code doit suivre une empreinte spécifique, qui prend un objet IBackgroundTaskRegistration et un objet BackgroundTaskProgressEventArgs :
Utilisez l’empreinte suivante pour la méthode de gestionnaire d’é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](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& /* 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.
};
Étape 2
Ajoutez du code au gestionnaire d’événements qui traite de l’achèvement de la tâche en arrière-plan.
Par exemple, l’exemple de tâche en arrière-plan met à jour l’interface utilisateur avec l’état de progression transmis via le paramètre args :
private void OnProgress(IBackgroundTaskRegistration task, BackgroundTaskProgressEventArgs args)
{
var progress = "Progress: " + args.Progress + "%";
BackgroundTaskSample.SampleBackgroundTaskProgress = progress;
UpdateUI();
}
auto progress{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
{
winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
} };
auto progress = [this](BackgroundTaskRegistration^ task, BackgroundTaskProgressEventArgs^ args)
{
auto progress = "Progress: " + args->Progress + "%";
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
};
Inscrire les fonctions du gestionnaire d’événements avec des tâches en arrière-plan nouvelles et existantes
Étape 1
Lorsque l’application inscrit une tâche en arrière-plan pour la première fois, elle doit s’inscrire pour recevoir des mises à jour de progression et d’achèvement, au cas où la tâche s’exécute alors que l’application est toujours active au premier plan.
Par exemple, l’exemple de tâche en arrière-plan appelle la fonction suivante sur chaque tâche en arrière-plan qu’elle inscrit :
private void AttachProgressAndCompletedHandlers(IBackgroundTaskRegistration task)
{
task.Progress += new BackgroundTaskProgressEventHandler(OnProgress);
task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
}
void SampleBackgroundTask::AttachProgressAndCompletedHandlers(Windows::ApplicationModel::Background::IBackgroundTaskRegistration const& task)
{
auto progress{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskProgressEventArgs const& args)
{
winrt::hstring progress{ L"Progress: " + winrt::to_hstring(args.Progress()) + L"%" };
BackgroundTaskSample::SampleBackgroundTaskProgress = progress;
UpdateUI();
} };
task.Progress(progress);
auto completed{ [this](
Windows::ApplicationModel::Background::BackgroundTaskRegistration const& /* sender */,
Windows::ApplicationModel::Background::BackgroundTaskCompletedEventArgs const& /* args */)
{
UpdateUI();
} };
task.Completed(completed);
}
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);
}
Étape 2
Lorsque l’application démarre ou accède à une nouvelle page dans laquelle l’état de la tâche en arrière-plan est pertinent, il doit obtenir la liste des tâches en arrière-plan actuellement inscrites et les associer aux fonctions de gestionnaire d’événements de progression et d’achèvement. La liste des tâches en arrière-plan actuellement inscrites par l’application est conservée dans BackgroundTaskRegistration.Propriété AllTasks.
Par exemple, l’exemple de tâche en arrière-plan utilise le code suivant pour attacher des gestionnaires d’événements lorsque la page SampleBackgroundTask est accédée à :
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(Windows::UI::Xaml::Navigation::NavigationEventArgs const& /* e */)
{
// A pointer back to the main page. This is needed if you want to call methods in MainPage such
// as NotifyUser().
m_rootPage = MainPage::Current;
// Attach progress and completed handlers to any existing tasks.
auto allTasks{ Windows::ApplicationModel::Background::BackgroundTaskRegistration::AllTasks() };
for (auto const& task : allTasks)
{
if (task.Value().Name() == SampleBackgroundTaskName)
{
AttachProgressAndCompletedHandlers(task.Value());
break;
}
}
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();
}
Rubriques connexes
- Créez et inscrivez une tâche en arrière-plan in-process.
- Créer et inscrire une tâche en arrière-plan hors processus
- Déclarer des tâches en arrière-plan dans le manifeste de l’application
- Gérer une tâche en arrière-plan annulée
- Inscrire une tâche en arrière-plan
- Répondre aux événements système avec des tâches en arrière-plan
- Définir des conditions pour l’exécution d’une tâche en arrière-plan
- Mettre à jour une vignette dynamique à partir d’une tâche en arrière-plan
- Utiliser un déclencheur de maintenance
- Exécuter une tâche en arrière-plan en fonction d’un minuteur
- Recommandations relatives aux tâches en arrière-plan
- Déboguer une tâche en arrière-plan
- Comment déclencher des événements d’interruption, de reprise et d’arrière-plan dans des applications UWP (lors du débogage)