백그라운드 작업 지침

앱이 백그라운드 작업 실행을 위한 요구 사항을 충족하는지 확인합니다.

백그라운드 작업 지침

백그라운드 작업을 개발하고 앱을 게시하기 전에 다음 지침을 잘 읽어보세요.

백그라운드 작업을 사용하여 백그라운드에서 미디어를 재생하는 경우, 미디어 재생이 더욱 쉬워진 Windows 10 버전 1607의 향상된 기능에 대한 자세한 내용은 백그라운드에서 미디어 재생하기를 참조하세요.

In-process 및 Out-of-process 백그라운드 작업: Windows 10 버전 1607에는 포그라운드 앱과 동일한 프로세스로 백그라운드 코드를 실행할 수 있게 해 주는 In-process 백그라운드 작업이 도입되었습니다. In-process 및 Out-of-process 백그라운드 작업이 있는지 여부를 판단할 때는 다음 요소를 고려하세요.

고려 사항 영향
복원력 백그라운드 프로세스가 다른 프로세스로 실행되는 경우에는 백그라운드 프로세스에서 충돌이 발생해도 포그라운드 애플리케이션이 중단되지 않습니다. 또한 실행 시간 제한을 초과하여 실행되면 앱 내에서도 백그라운드 활동을 종료할 수 있습니다. 포그라운드 프로세스와 백그라운드 프로세스가 서로 통신할 필요가 없는 경우에는 백그라운드 작업을 포그라운드 앱과 별개의 작업으로 분리하는 것이 더 좋을 수 있습니다. In-process 백그라운드 작업의 주요 장점 중 하나가 바로 프로세스 간 통신의 필요성을 없애 준다는 점이기 때문입니다.
단순함 In-process 백그라운드 작업은 프로세스 간 통신이 필요하지 않으며 기록이 덜 복잡합니다.
사용 가능한 트리거 In-process 백그라운드 작업은 DeviceUseTrigger 트리거, DeviceServicingTrigger 트리거 및 IoTStartupTask 트리거를 지원하지 않습니다.
VoIP In-process 백그라운드 작업은 애플리케이션 내에서의 VoIP 백그라운드 작업 활성화를 지원하지 않습니다.

트리거 인스턴스 수에 대한 제한: 앱에서 등록할 수 있는 일부 트리거의 인스턴스 수에 대한 제한이 있습니다. 앱은 앱 인스턴스당 ApplicationTrigger, MediaProcessingTriggerDeviceUseTrigger를 한 번씩만 등록할 수 있습니다. 앱이 이 제한을 초과하는 경우 등록이 예외를 throw합니다.

CPU 할당량: 백그라운드 작업은 트리거 형식에 따라 얻을 수 있는 벽시계 사용 시간의 양에 따라 제한됩니다. 대부분의 트리거는 벽시계 사용 시간이 30초로 제한되지만, 일부 트리거는 집약적인 작업을 완료하기 위해 최대 10분까지 실행될 수 있습니다. 배터리 수명을 절약하고 포그라운드 앱에 더 나은 사용자 환경을 제공하기 위해서는 백그라운드 작업이 간단해야 합니다. 백그라운드 작업에 적용되는 리소스 제약 조건은 백그라운드 작업을 이용한 앱 지원을 참조하세요.

백그라운드 작업 관리: 앱은 등록된 백그라운드 작업의 목록을 가져오고, 진행 처리기 및 완료 처리기를 등록하고, 해당 이벤트를 적절하게 처리해야 합니다. 백그라운드 작업 클래스는 진행, 취소 및 완료를 보고해야 합니다. 자세한 내용은 취소된 백그라운드 작업 처리하기백그라운드 작업 진행 및 완료 모니터링을 참조하세요.

BackgroundTaskDeferral 사용: 백그라운드 작업 클래스가 비동기 코드를 실행하면 지연을 사용해야 합니다. 사용하지 않으면 Run 메서드(또는 In-process 프로세스 백그라운드 작업의 경우 OnBackgroundActivated 메서드)가 반환될 때 백그라운드 작업이 중간에 종료될 수 있습니다. 자세한 내용은 Out-of-process 백그라운드 작업 생성 및 등록을 참조하세요.

아니면 지연을 1회 요청한 다음, async/await를 사용하여 비동기 메서드 호출을 완료하세요. await 메서드를 호출한 후에 지연을 닫으세요.

앱 매니페스트 업데이트: Out-of-process로 실행되는 백그라운드 작업의 경우, 애플리케이션 매니페스트의 각 백그라운드 작업을 작업과 같이 사용될 트리거의 형식과 함께 선언하세요. 그렇지 않으면 앱이 런타임에 백그라운드 작업을 등록할 수 없게 됩니다.

백그라운드 작업이 여러 개 있는 경우 동일한 호스트 프로세스에서 실행할지 다른 호스트 프로세스에 분리할지 고려하는 것이 좋습니다. 한 백그라운드 작업의 장애가 다른 백그라운드 작업을 중단시킬 것이 우려되는 경우 별도 호스트 프로세스에 놓습니다. 매니페스트 디자이너에서 리소스 그룹 항목을 사용하여 백그라운드 작업을 다른 호스트 프로세스로 그룹화합니다.

리소스 그룹을 설정하려면, Package.appxmanifest 디자이너를 열고, 선언을 선택하고 App Service 선언을 추가합니다.

Resource group setting

리소스 그룹 설정에 대한 자세한 내용은 응용 프로그램 스키마 참조를 참조하세요.

포그라운드 앱과 동일한 프로세스로 실행되는 백그라운드 작업은 애플리케이션 매니페스트에서 스스로를 선언할 필요가 없습니다. 매니페스트에서 Out-of-process로 실행되는 백그라운드 작업을 선언하는 방법에 대한 자세한 내용은 애플리케이션 매니페스트에서 백그라운드 작업 선언하기를 참조하세요.

앱 업데이트 준비: 앱이 업데이트되는 경우 이전 버전의 앱에 대한 백그라운드 작업의 등록을 취소하고 새 버전에 대한 백그라운드 작업을 등록하려면, ServicingComplete 백그라운드 작업(SystemTriggerType 참조)을 생성하고 등록하세요. 이는 포그라운드에서 실행되는 상황의 외부에서 필요할 수 있는 앱 업데이트를 실행하기에 적절한 시기입니다.

백그라운드 작업 실행 요청:

중요 Windows 10부터는 앱이 백그라운드 작업 실행의 필수 조건으로서 잠금 화면에 있을 필요가 더 이상 없습니다.

UWP(유니버설 Windows 플랫폼) 앱은 잠금 화면에 고정되지 않은 상태에서도 모든 지원 대상 작업 유형을 실행할 수 있습니다. 그러나 앱은 GetAccessState를 호출하고 앱이 백그라운드에서 실행되지 못하도록 거부되지 않았는지 확인해야 합니다. GetAccessStatus가 거부된 BackgroundAccessStatus 열거형 중 하나를 반환하지 않는지 확인합니다. 사용자가 디바이스 설정에서 해당 앱에 대해 명시적으로 백그라운드 작업 권한을 거부한 경우에는 이 메서드가 BackgroundAccessStatus.DeniedByUser를 반환합니다.

앱이 백그라운드에서 실행되지 못하도록 거부되면 앱은 RequestAccessAsync를 호출하 고 백그라운드 작업을 등록하기 전에 응답이 거부되지 않았는지 확인해야 합니다.

백그라운드 작업 및 배터리 절약 모드와 관련된 사용자 선택에 대한 자세한 내용은 백그라운드 작업 최적화를 참조하세요.

백그라운드 작업 체크리스트

In-process 및 out of process 백그라운드 작업 모두에 적용

  • 백그라운드 작업을 올바른 트리거에 연결하세요.
  • 백그라운드 작업이 성공적으로 실행되는 데 유용한 조건을 추가하세요.
  • 백그라운드 작업 진행, 완료 및 취소를 처리하세요.
  • 앱이 열리는 동안 백그라운드 작업을 다시 등록하세요. 이렇게 하면 앱이 최초로 열릴 때 백그라운드 작업이 등록됩니다. 이외에도 사용자가 앱의 백그라운드 실행 기능(이벤트 등록이 실패한 경우)을 사용하지 않도록 설정했는지 여부를 감지하는 방법이 제공됩니다.
  • 백그라운드 작업 등록 오류를 검사하세요. 해당하는 경우, 다른 매개변수 값으로 백그라운드 작업을 다시 등록해 보세요.
  • 데스크톱을 제외한 모든 디바이스 제품군의 경우 디바이스의 메모리가 적어지면 백그라운드 작업이 종료될 수 있습니다. 메모리 부족 예외가 발생하지 않거나 앱에서 이 현상을 처리하지 않으면 경고 없이, 그리고 OnCanceled 이벤트가 발생하지 않은 상태에서 백그라운드 작업이 종료됩니다. 이렇게 하면 포그라운드에서 앱의 사용자 환경을 보장할 수 있습니다. 백그라운드 작업은 이 시나리오를 처리하도록 설계되어야 합니다.

Out-of-process 백그라운드 작업에만 적용

  • Windows 런타임 구성 요소에서 백그라운드 작업을 만듭니다.
  • 백그라운드 작업의 알림, 타일, 배지 업데이트를 제외한 UI는 표시하지 마세요.
  • Run(실행) 메서드에서 각 비동기 메서드 호출에 대해 지연을 요청하고, 해당 메서드가 완료되면 지연을 닫으세요. 아니면 async/await로 지연을 1회 사용하세요.
  • 백그라운드 작업과 앱 간에 데이터를 공유하려면 영구 스토리지를 사용하세요.
  • 애플리케이션 매니페스트의 각 백그라운드 작업을 작업과 같이 사용될 트리거의 형식과 함께 선언하세요. 진입점 및 트리거 형식이 올바른지 확인하세요.
  • 앱과 동일한 컨텍스트에서 실행해야 하는 트리거(예: ControlChannelTrigger)를 사용하지 않는 한, 매니페스트에 실행 파일 요소를 지정하지 마세요.

In-process 백그라운드 작업에만 적용

  • 작업 취소 시 취소가 이뤄지기 전에 BackgroundActivated 이벤트 처리기가 종료되거나 전체 프로세스가 종료되는지 확인하세요.
  • 수명이 짧은 백그라운드 작업을 기록하세요. 대부분의 백그라운드 작업은 벽시계로 측정하는 30초로 제한됩니다.

피해야 할 일

  • COM 또는 RPC를 통한 프로세스 간 통신의 사용을 최소화합니다.
  • 통신할 프로세스가 실행 상태가 아닐 수 있으며,이로 인해 중단될 수 있습니다.
  • 프로세스 간 통신을 용이하게 하는 데 많은 시간이 소요될 수 있으며, 백그라운드 작업을 실행하는 데 할당된 시간을 계산합니다.
  • 백그라운드 작업에서 사용자 상호 작용에 의존하지 마세요.