다음을 통해 공유


백그라운드 작업 진행 및 완료 모니터링

중요 API

앱이 Out-of-process로 실행되는 백그라운드 작업에서 보고된 진행률 및 완료를 인식하는 방법을 알아보세요. (In-process 백그라운드 작업의 경우 진행률 및 완료를 나타내도록 공유 변수를 설정할 수 있습니다.)

백그라운드 작업 진행률 및 완료는 앱 코드로 모니터링할 수 있습니다. 이렇게 하려면 앱이 시스템에 등록된 백그라운드 작업의 이벤트를 구독해야 합니다.

완료된 백그라운드 작업을 처리할 이벤트 처리기 생성

1단계

완료된 백그라운드 작업을 처리할 이벤트 처리기 함수를 생성하세요. 이 코드는 IBackgroundTaskRegistrationBackgroundTaskCompletedEventArgs 개체를 사용하는 특정 공간을 따라야 합니다.

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();
}