다음을 통해 공유


백그라운드 작업 마이그레이션 전략

백그라운드 작업은 컴퓨터에서 특정 트리거가 호출될 때 작업을 수행하기 위해 UWP 앱에서 많이 사용됩니다. 트리거를 수신 대기하는 서비스를 실행할 필요가 없으므로 전원이 매우 효율적입니다. 따라서 UWP 앱을 WinUI 3 및 Windows 앱 SDK를 사용하는 다른 데스크톱 앱으로 마이그레이션하는 동안 개발자는 플랫폼에서 백그라운드 작업을 구현하기 위한 지원이 필요할 수 있습니다.

UWP 앱 모델에서 제공되는 백그라운드 작업은 프로세스 외부에서 실행되는(out-of-proc) 또는 프로세스 내부에서 실행되는(in-proc) 작업일 수 있습니다. 이 문서에서는 Windows 앱 SDK에서 BackgroundTaskBuilder API로 이동할 때 이러한 각 형식에 대한 마이그레이션 전략을 설명합니다.

프로세스 외부 백그라운드 작업

UWP의 out-of-proc 백그라운드 작업의 경우, 백그라운드 작업은 Windows 런타임(WinRT) 구성 요소로 작성하며, 등록 중에는 이 구성 요소가 BackgroundTaskBuilder에서 TaskEntryPoint로 설정됩니다. Windows 앱 SDK로 마이그레이션하는 동안 개발자는 이 as-is 유지하고 WinRT 구성 요소를 데스크톱 프로젝트와 함께 패키지할 수 있습니다. 이 경우, 트리거가 호출되면 중개자 인프라가 backgroundtaskhost 프로세스를 시작하고, WinRT 구성 요소의 백그라운드 작업이 그 프로세스에서 실행됩니다. 이 방법에서 백그라운드 작업은 IL(낮은 무결성 수준) 프로세스(backgroundtaskhost.exe)에서 실행되고 주 데스크톱 프로젝트는 중간 IL 프로세스에서 실행됩니다.

애플리케이션이 중간 IL 프로세스 자체에서 백그라운드 작업을 실행해야 하는 경우 백그라운드 작업에 완전 신뢰 COM 구성 요소를 사용해야 합니다. 이 시나리오에서 개발자는 Windows 앱 SDK BackgroundTaskBuilder 를 사용하여 완전 신뢰 COM 구성 요소를 등록해야 합니다. Windows.ApplicationModel.Background 네임스페이스의 BackgroundTaskBuilder API는 일부 트리거를 등록하는 동안 예외를 발생시킬 것입니다.

전체 WinUI 3 백그라운드 작업 등록 샘플은 GitHub찾을 수 있습니다.

구현에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 유일한 필수 변경은 WinRT BackgroundTaskBuilder API를 Windows 앱 SDK API Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder로 바꾸는 것입니다.

프로세스 내 백그라운드 작업

UWP의 in-proc 백그라운드 작업의 경우 백그라운드 작업 루틴은 포그라운드 프로세스의 일부로 실행되는 OnBackgroundActivated 콜백에서 구현됩니다. OnBackgroundActivated 콜백을 사용할 수 없기 때문에 WinUI 3 애플리케이션에서는 이 작업을 수행할 수 없습니다. 애플리케이션은 위에서 설명한 대로 백그라운드 작업 구현을 완전 신뢰 COM 작업으로 이동하고 패키지 매니페스트에서 COM 서버를 정의하여 작업의 COM 활성화를 처리해야 합니다. 트리거가 발생하면 트리거에 등록된 해당 COM Coclass에서 COM 활성화가 발생합니다.

전체 WinUI 3 백그라운드 작업 등록 샘플은 GitHub찾을 수 있습니다.

구현에 대한 자세한 내용은 여기에서 확인할 수 있습니다. 유일한 변경 내용은 WinRT BackgroundTaskBuilder API를 Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder의 Windows 앱 SDK API로 바꾸는 것입니다.

Windows 앱 SDK BackgroundTaskBuilder API

이 Windows 앱 SDK BackgroundTaskBuilder API는 WinUI 3 및 Windows 앱 SDK를 사용하는 다른 데스크톱 애플리케이션에서 완전 신뢰 COM 백그라운드 작업 구현을 지원하기 위해 만들어졌습니다. 이는 WinRT API가 몇 가지 트리거를 제외하고 등록 중에 예외를 발생시키기 때문입니다.

다음 코드는 Windows 앱 SDK BackgroundTaskBuilder API를 사용하여 백그라운드 작업을 등록하는 방법을 보여 줍니다.

//Using Windows App SDK API for BackgroundTaskBuilder
winrt::Microsoft::Windows::ApplicationModel::Background::BackgroundTaskBuilder builder;
SystemTrigger trigger = SystemTrigger(SystemTriggerType::TimeZoneChange, false);
auto backgroundTrigger = trigger.as<IBackgroundTrigger>();
builder.SetTrigger(backgroundTrigger);
builder.AddCondition(SystemCondition(SystemConditionType::InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();

다음은 동등한 C# 코드입니다.

// Using Windows App SDK API for BackgroundTaskBuilder
var builder = new Microsoft.Windows.ApplicationModel.Background.BackgroundTaskBuilder();
var trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
builder.SetTrigger(trigger);
builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
builder.SetTaskEntryPointClsid(classGuid);
builder.Register();

이 API를 사용하려면 아래 태그를 프로젝트 파일에 추가하여 Windows 앱 SDK 백그라운드 작업을 사용하도록 설정합니다.

<WindowsAppSDKBackgroundTask>true</WindowsAppSDKBackgroundTask>

또한 매니페스트 파일에서 BackgroundTaskEntryPoint는 다음으로 Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task설정됩니다.

<Extension Category="windows.backgroundTasks" EntryPoint="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task">
    <BackgroundTasks>
        <Task Type="general"/>
    </BackgroundTasks>
</Extension>

C# 애플리케이션의 경우 ActivatableClass 등록도 매니페스트 파일에 추가해야 합니다.

<Extension Category="windows.activatableClass.inProcessServer">
    <InProcessServer>
        <Path>Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.dll</Path>
        <ActivatableClass ActivatableClassId="Microsoft.Windows.ApplicationModel.Background.UniversalBGTask.Task" ThreadingModel="both"/>
    </InProcessServer>
</Extension>

백그라운드 작업 마이그레이션을 위해 TaskScheduler 활용

작업 스케줄러는 데스크톱 앱이 UWP 앱에서 BackgroundTaskBuilder 에서 제공하는 것과 동일한 기능을 달성할 수 있도록 지원합니다. TaskScheduler를 사용하는 구현에 대한 자세한 내용은 여기에서 확인할 수 있습니다.

Windows 앱 SDK 애플리케이션에서 ApplicationTrigger 사용

ApplicationTrigger 는 애플리케이션 프로세스를 일시 중단할 수 있는 수명 관리 시나리오로 인해 UWP 애플리케이션에서 지원됩니다. 이 시나리오는 WinUI 및 기타 Windows 앱 SDK 데스크톱 애플리케이션에 대해 발생하지 않으므로 이 트리거는 WinUI 애플리케이션에서 지원되지 않습니다. ApplicationTrigger와 관련된 모든 논리는 다른 프로세스를 시작하거나 스레드 풀 스레드에서 실행하여 실행되도록 다시 작성해야 합니다. 자세한 내용은 CreateThreadCreateProcess를 참조하세요.