유휴 또는 응답 없는 백그라운드 작업을 처리하는 방법

[ 이 문서는 Windows 런타임 앱을 작성하는 Windows에서 8.x 및 Windows Phone 8.x 개발자를 대상으로 합니다. Windows 10용으로 개발하는 경우에는 최신 설명서를 참조하세요.]

유휴 백그라운드 작업으로 인해 앱이 불필요하게 종료될 수 있습니다. 취소를 처리하고 백그라운드 작업을 완전히 종료하여 유휴 또는 응답 없는 백그라운드 작업을 처리합니다.

백그라운드 작업은 작업을 신속하게 완료하고 작업에서 돌아올 수 있는 수명이 짧은 작업이어야 합니다. 이 동작은 백그라운드 작업에 대한 엄격한 CPU 및 네트워크 리소스 제약 조건으로 인해 필요합니다. 백그라운드 작업은 앱이 일시 중단되거나 연결된 대기 상태일 때 백그라운드에서 코드를 실행할 수 있는 유일한 방법입니다. 리소스 사용 제약 조건은 백그라운드 작업이 배터리 수명에 미칠 수 있는 영향을 제한합니다.

이러한 제약 조건을 적용하기 위해 백그라운드 작업 인프라에서 유휴 상태가 되었거나 응답을 중지한 백그라운드 작업을 검색합니다. 백그라운드 작업에서 최소 시간 내에 최소한의 CPU나 네트워크 리소스 할당량을 사용하지 않으면 해당 백그라운드 작업은 유휴 상태나 응답 없는 상태로 간주됩니다. 최소 시간은 시스템이 연결된 대기 상태에 있는지 여부와 같은 시스템의 상태에 따라 달라집니다. 유휴 또는 응답 없는 백그라운드 작업이 감지되면 백그라운드 작업에 취소 알림을 보내 완전히 종료할 기회를 제공합니다. 백그라운드 작업이 5초 내에 완전히 종료하여 취소 알림에 응답하지 않으면 앱은 응답하지 않는 것으로 간주되고 시스템에서 앱을 종료합니다. 이 경우 WER 크래시 덤프 보고서가 생성되며, 이 보고서는 Windows 스토어 개발자 계정에서 볼 수 있습니다.

일반적으로 백그라운드 작업은 비동기 작업이 Run() 메서드를 반환할 때까지 기다리는 동안 유휴 또는 응답 없는 상태가 됩니다. 예를 들어 네트워크 소켓에서 응답을 기다리는 경우나 디스크가 응답하지 않는 긴 파일 복사 작업의 경우입니다. 다음 단계에 따라 비동기 작업을 기다리는 동안에도 백그라운드 작업 취소를 명확하게 처리합니다.

알아야 할 사항

기술

사전 요구 사항

  • 이 항목은 백그라운드 작업이 있는 앱에 적용됩니다.

지침

단계 1: 취소 처리기 등록

백그라운드 작업에 대해 항상 취소 처리기를 등록합니다. 시스템에서 유휴 또는 응답 없는 백그라운드 작업을 검색하면 취소 처리기를 호출합니다. 백그라운드 작업에는 취소 처리기가 있어야 하며 취소 처리기는 작업이 5초 내에 완전히 종료되도록 하거나 앱이 종료되도록 해야 합니다.

단계 2: 비동기 작업 취소

일부 작업은 Run() 메서드에서 만든 비동기 작업을 기다리는 동안 유휴 상태로 나타납니다. 보류 중인 모든 비동기 작업을 취소하는 간단한 방법은 단일 CancellationTokenSource를 모든 비동기 작업에 연결하는 것입니다. 그런 다음 취소 처리기에서 CancellationTokenSource에 대한 취소를 호출하여 보류 중인 모든 비동기 작업을 취소하면 됩니다.

단계 3: 백그라운드 작업 지연 완료

JavaScript에서 백그라운드 작업은 작업을 완료한 후 close()를 호출하여 작업이 종료되도록 해야 합니다. 끝에 close() 문을 사용하지 않으면 백그라운드 작업 인프라에서 작업에 계속 실행 중이며 JavaScript 호스트가 활성 상태로 유지된다고 가정합니다. 시스템은 close()를 호출하지 않고 종료된 JavaScript 백그라운드 작업을 유휴 상태 또는 응답 없음으로 감지하여 취소 알림도 보냅니다.

설명

유휴 또는 응답 없는 백그라운드 작업에 대한 모범 사례

유휴 또는 응답 없는 백그라운드 작업에 대해 다음 모범 사례를 사용합니다.

  1. 항상 취소 처리기를 백그라운드 작업에 연결합니다.
  2. 취소 처리기에서 모든 비동기 작업을 취소하고 5초 내에 반환하거나 앱을 종료합니다.
  3. 항상 JavaScript 백그라운드 작업을 종료하기 직전에 close()를 호출합니다.

예제 코드

다음 백그라운드 작업은 취소 처리기를 등록하고 비동기 작업을 취소하며 close()를 호출합니다.

(function () {
    "use strict";

    var cancelOperation = null;

    var backgroundTaskInstance = Windows.UI.WebUI.WebUIBackgroundTaskInstance.current;

    // Associate a cancellation handler with the background task.
    function onCanceled(cancelSender, cancelReason) {
        // The background task has been detected as idle or hung.
        // Cancel all pending async operations and return from the task.
        cancelOperation.cancel();
    }

    backgroundTaskInstance.addEventListener("canceled", onCanceled);

    // Main download function 
    function startDownload() {

        // Assign the URI to download from.
        var uriExample = new Windows.Foundation.Uri("https://www.contoso.com");

        // Get the folder for temporary files.
        var tempFolder = Windows.Storage.ApplicationData.current.temporaryFolder;

        // Create the temp file asynchronously.
        cancelOperation = tempFolder.createFileAsync("tempfile.txt")
           .then(function (tempFile) {
               // The createFileAsync call succeeded, so start the download operation.
               var downloader = new Windows.Networking.BackgroundTransfer.BackgroundDownloader();
               var transfer = downloader.createDownload(uriExample, tempFile);
               return transfer.startAsync();
           })
           .then(
               //Define the function to use when the download completes successfully.
               function (result) {
                   console.log("File download complete.");
               },
               // Define the error handling function.
               function (error) {
                   console.log("File download failed.");
               },
               // Define the progress handling function.
               function (progress) {
                   console.log("Bytes retrieved: " + progress.progress.bytesReceived);
               })
            .then (function () {
                // Always call close() before the task returns.
                close();
            }, function () {
                close();
            });    }

    startDownload(); 

})();

관련 항목

취소된 백그라운드 작업을 처리하는 방법