언어: HTML | XAML

빠른 시작: 백그라운드 작업 만들기 및 등록(XAML)

백그라운드 작업 클래스를 만든 다음 앱이 포그라운드에 없는 경우 기능을 제공하여 실행하도록 등록합니다.

사전 요구 사항

  • 앱은 백그라운드로 작업을 수행해야 하며, 이 작업은 플랫폼에서 제공하는 다른 백그라운드 기능을 사용하여 수행할 수 없습니다.

백그라운드 작업 클래스 만들기

IBackgroundTask 인터페이스를 구현하는 클래스를 작성하여 백그라운드로 코드를 실행할 수 있습니다. 이 코드는 예를 들면, SystemTrigger 또는 MaintenanceTrigger를 사용하여 특정 이벤트가 발생할 때 실행됩니다.

다음 단계에서는 IBackgroundTask 인터페이스를 구현하는 새 클래스를 작성하는 방법을 보여 줍니다. 시작하기 전에 솔루션에서 백그라운드 작업에 대한 새 프로젝트를 만듭니다. 백그라운드 작업에 대한 빈 클래스를 새로 추가하고 Windows.ApplicationModel.Background 네임스페이스를 가져옵니다.

  1. 백그라운드 작업에 대한 새 프로젝트를 만들고 솔루션에 추가합니다. 이렇게 하려면 솔루션을 마우스 오른쪽 단추로 클릭하고 추가->새 프로젝트를 선택합니다. 그런 다음 Windows 런타임 구성 요소 프로젝트 형식을 선택하고 프로젝트 이름을 지정한 후 확인을 클릭합니다.
  2. Windows 스토어 앱 또는 Windows Phone 앱 프로젝트에서 백그라운드 작업 프로젝트를 참조합니다.

    C++ 앱의 경우 앱 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 그런 다음 공용 속성으로 이동하여 새 참조 추가를 클릭한 후 백그라운드 작업 프로젝트 옆의 확인란을 선택하고 두 대화 상자에서 모두 확인을 클릭합니다.

    C# 앱의 경우 앱 프로젝트에서 참조를 마우스 오른쪽 단추로 클릭하고 새 참조 추가를 선택합니다. 솔루션 아래에서 프로젝트를 선택하고 백그라운드 작업 프로젝트의 이름을 선택한 후 확인을 클릭합니다.

  3. IBackgroundTask 인터페이스를 구현하는 새 클래스를 만듭니다. Run 메서드는 지정한 이벤트가 트리거될 때 호출되는 필수 진입점입니다. 이 메서드는 모든 백그라운드 작업에 필요합니다.

    참고  백그라운드 작업 클래스 자체와 백그라운드 작업 프로젝트의 다른 모든 클래스가 sealedpublic 클래스여야 합니다.

    다음 샘플 코드는 백그라운드 작업 클래스의 기본 시작 지점을 보여 줍니다.

    
    
    //
    // ExampleBackgroundTask.cs
    //
    
    using Windows.ApplicationModel.Background;
    
    namespace Tasks
    {
        public sealed class ExampleBackgroundTask : IBackgroundTask
        {
            public void Run(IBackgroundTaskInstance taskInstance)
            {
                
            }        
        }
    }
    
    
    
    //
    // ExampleBackgroundTask.h
    //
    
    #pragma once
    
    using namespace Windows::ApplicationModel::Background;
    
    namespace Tasks
    {
        public ref class ExampleBackgroundTask sealed : public IBackgroundTask
        {
    
        public:
            ExampleBackgroundTask();
    
            virtual void Run(IBackgroundTaskInstance^ taskInstance);
            void OnCompleted(
                    BackgroundTaskRegistration^ task,
                    BackgroundTaskCompletedEventArgs^ args
                    );
        };
    }
    
    
  4. 백그라운드 작업에서 비동기 코드를 실행할 경우 백그라운드 작업은 deferral을 사용해야 합니다. deferral을 사용하지 않을 경우 비동기 메서드 호출이 완료되기 전에 Run 메서드가 완료되면 백그라운드 작업 프로세스가 예기치 않게 종료될 수 있습니다.

    비동기 메서드를 호출하기 전에 Run 메서드에서 deferral을 요청합니다. 비동기 메서드에서 액세스할 수 있도록 deferral을 전역 변수에 저장합니다. 비동기 코드가 완료된 후에 deferral 완료를 선언합니다.

    다음 샘플 코드는 deferral을 가져와서 저장하고, 비동기 코드가 완료되면 해제합니다.

    
    
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
        
        //
        // TODO: Insert code to start one or more asynchronous methods using the
        //       await keyword, for example:
        //
        // await ExampleMethodAsync();
        //
        
        _deferral.Complete();
    }
    
    
    참고  C#에서는 async/await 키워드를 사용하여 백그라운드 작업의 비동기 메서드를 호출할 수 있습니다. C++에서는 작업 체인을 사용하여 유사한 결과를 얻을 수 있습니다.

    비동기 패턴에 대한 자세한 내용은 비동기 프로그래밍을 참조하세요. deferral을 사용하여 백그라운드 작업이 일찍 중지되지 않도록 하는 방법의 추가 예제를 보려면 백그라운드 작업 샘플(영문)을 참조하세요.

다음 단계는 앱 클래스 중 하나(예제: MainPage.xaml.cs)에서만 완료합니다.

참고  백그라운드 작업을 등록하는 데에만 사용되는 함수를 만들 수도 있습니다. 백그라운드 작업을 등록하는 방법을 참조하세요. 이 경우 다음 세 단계를 사용하지 않고 트리거를 생성하여 작업 이름, 작업 진입점 및 조건(옵션)과 함께 등록 함수에 제공하면 됩니다.

실행할 백그라운드 작업 등록

  1. BackgroundTaskRegistration.AllTasks 속성을 반복하여 백그라운드 작업이 이미 등록되어 있는지 확인합니다. 이 단계는 중요합니다. 앱이 기존 백그라운드 작업 등록을 확인하지 않는 경우 작업을 여러 번 등록하기 쉬우므로 성능에 문제가 발생하거나 작업이 완료되기 전에 작업의 가용 CPU 시간을 모두 사용할 수 있습니다.

    다음 예제에서는 AllTasks 속성을 반복하고 작업이 이미 등록된 경우 플래그 변수를 true로 설정합니다.

    
    var taskRegistered = false;
    var exampleTaskName = "ExampleBackgroundTask";
    
    foreach (var task in Background.BackgroundTaskRegistration.AllTasks)
    {
        if (task.Value.Name == exampleTaskName)
        {
            taskRegistered = true;
            break;
        }
    }
    
    
  2. 백그라운드 작업이 아직 등록되지 않은 경우 BackgroundTaskBuilder를 사용하여 백그라운드 작업의 인스턴스를 만듭니다. 작업 진입점이 네임스페이스가 앞에 오는 백그라운드 작업 클래스의 이름이어야 합니다.

    백그라운드 작업 트리거는 백그라운드 작업이 실행되는 시간을 제어합니다. 가능한 트리거 목록은 SystemTrigger를 참조하세요.

    예를 들어 다음 코드는 새 백그라운드 작업을 만들고 TimeZoneChanged 트리거가 발생할 때 실행되도록 설정합니다.

    
    
    var builder = new BackgroundTaskBuilder();
    
    builder.Name = exampleTaskName;
    builder.TaskEntryPoint = "Tasks.ExampleBackgroundTask";
    builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));
    
    
  3. 트리거 이벤트가 발생한 후 작업이 실행될 시간을 제어하는 조건을 추가할 수도 있습니다(옵션). 예를 들어 사용자가 있을 때까지 작업이 실행되지 않게 하려면 UserPresent 조건을 사용합니다. 가능한 조건 목록은 SystemConditionType을 참조하세요.

    다음 샘플 코드에서는 사용자가 있어야 하는 조건을 할당합니다.

    
    builder.AddCondition(new SystemCondition(SystemConditionType.UserPresent));
    
    
  4. BackgroundTaskBuilder 개체에 대해 Register 메서드를 호출하여 백그라운드 작업을 등록합니다. BackgroundTaskRegistration 결과를 다음 단계에서 사용할 수 있도록 저장합니다.

    다음 코드는 백그라운드 작업을 등록하고 결과를 저장합니다.

    
    BackgroundTaskRegistration task = builder.Register();
    
    

    참고  

    Windows Phone 스토어 앱의 경우 백그라운드 작업을 등록하기 전에 RequestAccessAsync을(를) 호출해야 합니다. Windows에서는 앱이 잠금 화면에 있어야 하는 백그라운드 작업 집합을 실행하려는 경우에만 이 호출이 필요하지만 Phone에서는 백그라운드 작업을 등록하기 전에 이 메서드를 한 번 호출해야 합니다.

    업데이트를 릴리스한 후 Windows Phone 스토어 앱이 계속해서 제대로 작동되도록 하기 위하여, 업데이트 후 앱이 시작될 때 RemoveAccessRequestAccessAsync을(를) 차례로 호출해야 합니다. 자세한 내용은 백그라운드 작업에 대한 지침(Windows 런타임 앱)을 참조하세요.

    참고  

    Windows 8.1부터 백그라운드 작업 등록 매개 변수는 등록 시 유효성이 검사됩니다. 등록 매개 변수가 하나라도 유효하지 않으면 오류가 반환됩니다. 백그라운드 작업 등록이 실패할 경우 앱에서 시나리오를 처리할 수 있어야 합니다. 예를 들어 조건문을 사용하여 등록 오류를 확인한 다음 다른 매개 변수 값을 사용하여 실패한 등록을 다시 시도해야 합니다.

이벤트 처리기를 사용하여 백그라운드 작업 완료 처리

앱에서 백그라운드 작업의 결과를 가져올 수 있도록 BackgroundTaskCompletedEventHandler를 사용하여 메서드를 등록해야 합니다. 앱을 포그라운드에서 마지막으로 실행한 이후에 백그라운드 작업이 완료된 경우 앱을 시작하거나 다시 시작하면 OnCompleted 메서드가 호출됩니다. 앱이 포그라운드에서 현재 실행 중인 경우에는 백그라운드 작업이 완료되면 OnCompleted 메서드가 즉시 호출됩니다.

  1. 백그라운드 작업 완료를 처리하는 OnCompleted 메서드를 씁니다. 예를 들어 백그라운드 작업의 결과로 UI가 업데이트될 수 있습니다. 이 예제에서는 args 매개 변수를 사용하지 않지만 여기에 표시된 메서드 공간은 OnCompleted 이벤트 처리기 메서드에 필요합니다.

    다음 샘플 코드에서는 백그라운드 작업 완료를 인식하고 메시지 문자열을 가져오는 예제 UI 업데이트 메서드를 호출합니다.

    
    
    private void OnCompleted(IBackgroundTaskRegistration task, BackgroundTaskCompletedEventArgs args)
    {
        var settings = ApplicationData.Current.LocalSettings;
        var key = task.TaskId.ToString();
        var message = settings.Values[key].ToString();
        UpdateUIExampleMethod(message);
    }
    
    
    참고  UI 스레드가 중지되는 것을 방지하려면 UI 업데이트를 비동기적으로 수행해야 합니다. 예제를 보려면 백그라운드 작업 샘플(영문)의 UpdateUI 메서드를 참조하세요.
  2. 백그라운드 작업을 등록한 위치로 돌아갑니다. 해당 코드 줄 뒤에 새 BackgroundTaskCompletedEventHandler 개체를 추가합니다. OnCompleted 메서드를 BackgroundTaskCompletedEventHandler 생성자에 대한 매개 변수로 제공합니다.

    다음 샘플 코드에서는 BackgroundTaskCompletedEventHandlerBackgroundTaskRegistration에 추가합니다.

    
    
    task.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted);
    
    

앱 매니페스트에서 앱이 백그라운드 작업을 사용한다고 선언

백그라운드 작업을 실행하려면 먼저 앱 매니페스트에서 각 백그라운드 작업을 선언해야 합니다.

  • 앱 매니페스트("package.appmanifest" 파일)를 열고 Extensions 요소로 이동합니다. 앱에 사용된 각 백그라운드 작업 클래스에 대해 범주를 "windows.backgroundTasks"로 설정하여 Extension 요소를 추가합니다.

    백그라운드 작업에 사용되는 각 트리거 형식을 나열해야 합니다. 앱에서 매니페스트에 나열되지 않은 트리거를 사용하여 백그라운드 작업을 등록하려고 시도하면 등록이 실패합니다.

    다음 Extensions 샘플 요소는 이 항목에서 만든 백그라운드 작업을 등록합니다.

    
    
    <Extensions>
      <Extension Category="windows.backgroundTasks" EntryPoint="Tasks.ExampleBackgroundTask">
        <BackgroundTasks>
          <Task Type="systemEvent" />
        </BackgroundTasks>
      </Extension>
    </Extensions>
    
    

요약

이제 백그라운드 작업 클래스를 작성하는 방법, 앱 내에서 백그라운드 작업을 등록하는 방법 및 백그라운드 작업이 완료될 때 앱에서 인식하는 방법을 이해해야 합니다. 또한 Windows 8에서 앱의 백그라운드 작업 등록을 허용하도록 응용 프로그램 매니페스트를 업데이트하는 방법을 이해해야 합니다.

참고  백그라운드 작업을 사용하는, 완벽하고 강력한 기능을 갖춘 Windows 스토어 앱의 컨텍스트에서 비슷한 코드 예제를 보려면 백그라운드 작업 샘플(영문)을 다운로드하세요.

API 참조, 백그라운드 작업 개념 지침, 백그라운드 작업을 사용하는 앱을 작성하는 자세한 방법에 대해서는 다음 관련 항목을 참조하세요.

관련 항목

자세한 백그라운드 작업 지침 항목
백그라운드 작업으로 시스템 이벤트에 응답하는 방법
백그라운드 작업을 등록하는 방법
백그라운드 작업 실행 조건을 설정하는 방법
유지 관리 트리거를 사용하는 방법
취소된 백그라운드 작업을 처리하는 방법
백그라운드 작업 진행 및 완료를 모니터링하는 방법
타이머에 따라 백그라운드 작업을 실행하는 방법
백그라운드 작업 지침
백그라운드 작업에 대한 지침 및 검사 목록
How to debug a background task
Windows 스토어 앱에서 일시 중단, 다시 시작 및 백그라운드 이벤트를 트리거하는 방법(디버깅 시)
백그라운드 작업 API 참조
Windows.ApplicationModel.Background

 

 

표시:
© 2015 Microsoft