언어: HTML | XAML

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

Applies to Windows and Windows Phone

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

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

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

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

알아야 할 사항

기술

사전 요구 사항

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

지침

단계 1: 취소 처리기 등록

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

단계 2: 비동기 작업 취소

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

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

C#/C++/VB에서 백그라운드 작업은 작업을 완료한 후 항상 백그라운드 작업 지연 개체에서 Complete()를 호출하여 작업이 종료되도록 해야 합니다. 지연에 대해 Complete()를 호출하지 않으면 백그라운드 작업이 종료되지 않습니다. 백그라운드 작업 인프라는 해당 작업이 유휴 상태가 될 때 감지하여 작업에 취소 알림을 보냅니다.

설명

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

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

  1. 항상 취소 처리기를 백그라운드 작업에 연결합니다.
  2. 취소 처리기에서 모든 비동기 작업을 취소하고 5초 내에 반환하거나 앱을 종료합니다.
  3. 항상 C#/C++/VB 백그라운드 작업이 종료되기 직전에 백그라운드 작업 지역 개체에서 Complete()를 호출합니다.

예제 코드

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


public sealed class ExampleClass:IBackgroundTask
{
    CancellationTokenSource cancelTokenSource = new CancellationTokenSource();

    async void Run(IBackgroundTaskInstance taskInstance)
    {
        BackgroundTaskDeferral deferral = taskInstance.GetDeferral();
        HostName server = new HostName("contoso.com");
        StreamSocket sock = new StreamSocket();
        
        // Skipping other extraneous code.
        
        // Associate a cancellation handler with the background task.
        taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);

        try
        {    
            await sock.ConnectAsync(server, "http").AsTask(cancelTokenSource.Token);
            await sock.InputStream.ReadAsync(…).AsTask(cancelTokenSource.Token);                   
        }
        finally { deferral.Complete(); }
    }
    

    private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
    {
        // The background task has been detected as idle or hung.
        // Cancel all pending async operations and return from the task.
        cancelTokenSource.Cancel(); 
    }
}


관련 항목

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

 

 

표시:
© 2015 Microsoft