백그라운드 작업 등록

중요 API

대부분의 백그라운드 작업을 안전하게 등록하기 위해 다시 사용할 수 있는 함수를 만드는 방법을 알아봅니다.

이 토픽은 In-process 백그라운드 작업과 Out-of-process 백그라운드 작업 모두에 적용할 수 있습니다. 이 토픽에서는 등록해야 하는 백그라운드 작업이 이미 있다고 가정합니다. (백그라운드 작업의 작성 방법에 대한 자세한 내용은 Out-of-process로 실행되는 백그라운드 작업의 생성 및 등록 또는 In-Process 백그라운드 작업 생성 및 등록 참조).

이 토픽에서는 백그라운드 작업을 등록하는 유틸리티 함수를 설명합니다. 이 유틸리티 함수는 복수 등록으로 인한 문제를 방지하기 위해 작업을 여러 번 등록하기 전에 먼저 기존 등록을 검사하며, 시스템 조건을 백그라운드 작업에 적용할 수 있습니다. 설명 내용에는 이 유틸리티 함수의 완전한 작업 예제가 포함되어 있습니다.

참고  

유니버설 Windows 앱은 백그라운드 트리거 유형을 어떤 것이든 등록하기 전에 RequestAccessAsync를 호출해야 합니다.

업데이트를 배포한 후에도 유니버설 Windows 앱이 계속해서 제대로 실행되도록 하려면, 업데이트 후 앱이 시작될 때 RemoveAccess를 호출한 다음 RequestAccessAsync를 호출해야 합니다. 자세한 내용은 백그라운드 작업 지침을 참조하세요.

메서드 서명 및 반환 형식 정의하기

이 메서드는 작업 진입점, 작업 이름, 미리 생성된 백그라운드 작업 트리거 및 (선택 사항으로) 백그라운드 작업의 SystemCondition을 사용합니다. 이 메서드는 BackgroundTaskRegistration 개체를 반환합니다.

Important

taskEntryPoint - Out of process로 실행되는 백그라운드 작업의 경우 네임스페이스 이름, '.' 및 백그라운드 클래스가 포함된 클래스 이름으로 구성되어야 합니다. 이 문자열은 대소문자를 구분합니다. 예를 들어 백그라운드 클래스 코드가 포함된 "BackgroundTask1" 클래스와 "MyBackgroundTasks" 네임스페이스가 있는 경우 taskEntryPoint 문자열은 "MyBackgroundTasks.BackgroundTask1"이 됩니다. 백그라운드 작업이 앱과 동일한 프로세스로 실행되는 경우(즉 In-process 백그라운드 작업), taskEntryPoint를 설정해서는 안 됩니다.

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    
    // We'll add code to this function in subsequent steps.

}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{
    
    // We'll add code to this function in subsequent steps.

}

기존 등록 확인하기

작업이 이미 등록되어 있는지 확인하세요. 작업이 여러 번 등록되었다면 트리거될 때마다 두 번 이상 실행되므로 이를 확인하는 것이 중요합니다. 이처럼 여러 번 등록되면 CPU가 초과되고 예기치 않은 동작이 발생할 수 있습니다.

BackgroundTaskRegistration.AllTasks 속성을 쿼리하고 결과를 반복하면 기존 등록을 확인할 수 있습니다. 각 인스턴스의 이름을 확인하세요. 인스턴스 이름이 등록하려는 작업의 이름과 일치하는 경우 루프에서 분리한 다음, 코드가 다음 단계에서 다른 경로를 선택할 수 있도록 플래그 변수를 설정하세요.

참고 앱에 고유한 백그라운드 작업 이름을 사용하세요. 각 백그라운드 작업에 고유한 이름이 있는지 확인하세요.

다음 코드는 마지막 단계에서 생성한 SystemTrigger를 사용해서 백그라운드 작업을 등록합니다.

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == name)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }
    
    // We'll register the task in the next step.
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{
    //
    // Check for existing registrations of this background task.
    //
    
    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;
    
    while (hascur)
    {
        auto cur = iter->Current->Value;
        
        if(cur->Name == name)
        {
            //
            // The task is registered.
            //
            
            return (BackgroundTaskRegistration ^)(cur);
        }
        
        hascur = iter->MoveNext();
    }
    
    // We'll register the task in the next step.
}

백그라운드 작업 등록하기(또는 기존 등록 반환하기)

기존 백그라운드 작업 등록 목록에 작업이 있는지 확인하세요. 있다면 작업의 해당 인스턴스를 반환하세요.

그런 다음 새 BackgroundTaskBuilder 개체를 사용해서 작업을 등록하세요. 이 코드에서는 조건 매개변수가 null인지 여부를 검사하고, 조건 매개변수가 null이 아니라면 등록 개체에 조건을 추가해야 합니다. BackgroundTaskBuilder.Register 메서드를 통해 반환된 BackgroundTaskRegistration을 반환하세요.

참고 백그라운드 작업 등록 매개변수는 등록 시 유효성 검사를 거칩니다. 등록 매개변수 중 하나라도 유효하지 않으면 오류가 반환됩니다. 백그라운드 작업 등록이 실패하는 시나리오를 앱이 정상적으로 처리해야 합니다. 그 대신 앱이 작업 등록을 시도한 후 유효한 등록 개체를 갖는 데 의존할 경우에는 충돌이 발생할 수 있습니다. 참고 앱과 동일한 프로세스로 실행되는 백그라운드 작업을 등록하려는 경우, taskEntryPoint 매개변수의 String.Empty 또는 null을(를) 전송하세요.

다음 예제에서는 기존 작업을 반환하거나 백그라운드 작업(있는 경우 선택적 시스템 조건 포함)을 등록할 코드를 추가합니다.

public static BackgroundTaskRegistration RegisterBackgroundTask(
                                                string taskEntryPoint,
                                                string name,
                                                IBackgroundTrigger trigger,
                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = name;

    // in-process background tasks don't set TaskEntryPoint
    if ( taskEntryPoint != null && taskEntryPoint != String.Empty)
    {
        builder.TaskEntryPoint = taskEntryPoint;
    }
    builder.SetTrigger(trigger);

    if (condition != null)
    {
        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(
                                             Platform::String ^ taskEntryPoint,
                                             Platform::String ^ taskName,
                                             IBackgroundTrigger ^ trigger,
                                             IBackgroundCondition ^ condition)
{

    //
    // Check for existing registrations of this background task.
    //

    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;

    while (hascur)
    {
        auto cur = iter->Current->Value;

        if(cur->Name == name)
        {
            //
            // The task is registered.
            //

            return (BackgroundTaskRegistration ^)(cur);
        }

        hascur = iter->MoveNext();
    }

    //
    // Register the background task.
    //

    auto builder = ref new BackgroundTaskBuilder();

    builder->Name = name;
    builder->TaskEntryPoint = taskEntryPoint;
    builder->SetTrigger(trigger);

    if (condition != nullptr) {
        
        builder->AddCondition(condition);
    }

    BackgroundTaskRegistration ^ task = builder->Register();

    return task;
}

백그라운드 작업 등록 유틸리티 함수 완료

이 예제에서는 완료된 백그라운드 작업 등록 함수를 보여줍니다. 이 함수는 네트워킹 백그라운드 작업을 제외한 대부분의 백그라운드 작업을 등록하는 데 사용할 수 있습니다.

//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,
                                                                string taskName,
                                                                IBackgroundTrigger trigger,
                                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            //
            // The task is already registered.
            //

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }

    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    builder.SetTrigger(trigger);

    if (condition != null)
    {

        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}
//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
BackgroundTaskRegistration^ MainPage::RegisterBackgroundTask(Platform::String ^ taskEntryPoint,
                                                             Platform::String ^ taskName,
                                                             IBackgroundTrigger ^ trigger,
                                                             IBackgroundCondition ^ condition)
{

    //
    // Check for existing registrations of this background task.
    //

    auto iter   = BackgroundTaskRegistration::AllTasks->First();
    auto hascur = iter->HasCurrent;

    while (hascur)
    {
        auto cur = iter->Current->Value;

        if(cur->Name == name)
        {
            //
            // The task is registered.
            //

            return (BackgroundTaskRegistration ^)(cur);
        }

        hascur = iter->MoveNext();
    }


    //
    // Register the background task.
    //

    auto builder = ref new BackgroundTaskBuilder();

    builder->Name = name;
    builder->TaskEntryPoint = taskEntryPoint;
    builder->SetTrigger(trigger);

    if (condition != nullptr) {

        builder->AddCondition(condition);
    }

    BackgroundTaskRegistration ^ task = builder->Register();

    return task;
}