백그라운드 작업 진행 및 완료 모니터링
중요 API
앱이 Out-of-process로 실행되는 백그라운드 작업에서 보고된 진행률 및 완료를 인식하는 방법을 알아보세요. (In-process 백그라운드 작업의 경우 진행률 및 완료를 나타내도록 공유 변수를 설정할 수 있습니다.)
백그라운드 작업 진행률 및 완료는 앱 코드로 모니터링할 수 있습니다. 이렇게 하려면 앱이 시스템에 등록된 백그라운드 작업의 이벤트를 구독해야 합니다.
- 이 토픽에서는 사용자에게 백그라운드 작업을 등록하는 앱이 있다고 가정합니다. 백그라운드 작업 구축을 빠르게 시작하려면 In-process 백그라운드 작업 생성 및 등록 또는 Out-of-process 백그라운드 작업 생성 및 등록을 참조하세요. 조건 및 트리거에 대한 자세한 내용은 백그라운드 작업을 이용한 앱 지원을 참조하세요.
완료된 백그라운드 작업을 처리할 이벤트 처리기 생성
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단계
백그라운드 작업 완료를 처리하는 이벤트 처리기에 코드를 추가하세요.
그 예로 백그라운드 작업 샘플은 UI를 업데이트합니다.
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 매개변수를 통해 전달된 진행률 상태로 UI를 업데이트합니다.
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();
}