Отслеживание хода выполнения и завершения фоновых задач
Важные API
Узнайте, как приложение может распознавать ход выполнения и завершение, сообщаемое фоновой задачей, которая выполняется вне процесса. (Для фоновых задач в процессе можно задать общие переменные для обозначения хода выполнения и завершения.)
Ход выполнения фоновой задачи и завершение можно отслеживать с помощью кода приложения. Для этого приложение подписывается на события из фоновых задач, зарегистрированных в системе.
- В этом разделе предполагается, что у вас есть приложение, которое регистрирует фоновые задачи. Чтобы быстро приступить к созданию фоновой задачи, см. статью "Создание и регистрация фоновой задачи в процессе" или "Создание" и регистрация фоновой задачи вне процесса. Дополнительные сведения об условиях и триггерах см. в статье "Поддержка приложения с помощью фоновых задач".
Создание обработчика событий для обработки завершенных фоновых задач
Шаг 1
Создайте функцию обработчика событий для обработки завершенных фоновых задач. Этот код должен соответствовать определенному следу, который принимает объект IBackgroundTaskRegistration и объект BackgroundTaskCompletedEventArgs.
Используйте следующий след для метода обработчика событий фоновой задачи 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.
};
Шаг 2
Добавьте код в обработчик событий, который занимается завершением фоновой задачи.
Например, пример фоновой задачи обновляет пользовательский интерфейс.
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();
};
Создание функции обработчика событий для обработки хода выполнения фоновой задачи
Шаг 1
Создайте функцию обработчика событий для обработки завершенных фоновых задач. Этот код должен соответствовать определенному следу, который принимает объект IBackgroundTaskRegistration и объект BackgroundTaskProgressEventArgs:
Используйте следующий след для метода обработчика событий фоновой задачи 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.
};
Шаг 2
Добавьте код в обработчик событий, который занимается завершением фоновой задачи.
Например, пример фоновой задачи обновляет пользовательский интерфейс с состоянием хода выполнения, переданным с помощью параметра 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();
};
Регистрация функций обработчика событий с новыми и существующими фоновыми задачами
Шаг 1
Когда приложение регистрирует фоновую задачу в первый раз, он должен зарегистрировать для получения обновлений хода выполнения и завершения, если задача выполняется, пока приложение по-прежнему активно на переднем плане.
Например, пример фоновой задачи вызывает следующую функцию для каждой фоновой задачи, которую он регистрирует:
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);
}
Шаг 2
При запуске приложения или переходе на новую страницу, на которой имеется соответствующее состояние фоновой задачи, он должен получить список фоновых задач, зарегистрированных и связать их с функциями обработчика событий хода выполнения и завершения. Список фоновых задач, зарегистрированных приложением, хранится в backgroundTaskRegistration.Свойство AllTasks.
Например, в примере фоновой задачи используется следующий код для присоединения обработчиков событий при переходе на страницу 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(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();
}
См. также
- Создайте и зарегистрируйте фоновую задачу в процессе.
- Создание и регистрация внепроцессной фоновой задачи
- Объявление фоновых задач в манифесте приложения
- Обработка отмененной фоновой задачи
- Регистрация фоновой задачи
- Реагирование на системные события с помощью фоновых задач
- Задание условий выполнения фоновой задачи
- Обновление живой плитки из фоновой задачи
- Использование триггера обслуживания
- Запуск фоновой задачи по таймеру
- Рекомендации по фоновым задачам
- Отладка фоновой задачи
- Как активировать приостановку, возобновление и фоновые события в приложениях UWP (при отладке)