백그라운드 작업 및 사용자 지정 트리거

백그라운드 작업은 백그라운드에서 코드를 실행하기 위한 Windows 10 한 가지 방법입니다. 표준 애플리케이션 플랫폼의 일부이며 기본적으로 시스템 이벤트(트리거)에 등록할 수 있는 기능을 앱에 제공하고 해당 이벤트가 발생할 때 백그라운드에서 미리 정의된 코드 블록을 실행합니다. 시스템 트리거에는 네트워크 연결 또는 시스템 표준 시간대의 변경과 같은 이벤트가 포함됩니다.

경우에 따라 제공된 시스템 트리거가 파트너 시나리오를 해결하기에 충분하지 않습니다. Windows 10 버전 1803부터 파트너에게 더 많은 유연성을 제공하고 더 많은 상황에서 백그라운드 작업을 사용할 수 있도록 하기 위해 파트너는 앱이 등록할 수 있는 사용자 지정 트리거를 만들 수 있습니다. 사용자 지정 트리거는 디바이스 드라이버 내에서 정의되며 원하는 하드웨어 조건에 대한 이벤트를 발생시키는 데 사용할 수 있습니다. 사용자 지정 트리거가 발생하면 앱이 표준 앱 모델과 정확히 동일한 방식으로 백그라운드 작업을 실행할 수 있습니다.

사용자 지정 트리거 구현

사용자 지정 트리거를 구현하는 두 단계가 있습니다. 특히 디바이스 드라이버 또는 시스템 서비스 내에서 트리거를 정의하고 발생시켜야 하며 백그라운드 작업이 있는 앱을 만들어야 합니다.

사용자 지정 트리거 만들기

사용자 지정 트리거는 RtlRaiseCustomSystemEventTrigger 함수를 통해 네이티브 서비스 또는 디바이스 드라이버 내에서 정의되고 발생합니다. 그런 다음 유니버설 앱에서 에 등록하고 시스템 정의 트리거와 비교적 동일한 방식으로 백그라운드 작업을 시작하는 데 사용할 수 있습니다.

다음 코드 발췌에서는 사용자 지정 트리거를 발생시킨 방법을 보여 줍니다.

#define GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID L"{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}"

CUSTOM_SYSTEM_EVENT_TRIGGER_CONFIG triggerConfig;
CUSTOM_SYSTEM_EVENT_TRIGGER_INIT(&triggerConfig,
                                 GUID_MY_CUSTOMSYSTEMEVENTTRIGGERID);

NTSTATUS status = RtlRaiseCustomSystemEventTrigger(&triggerConfig);

위의 코드 샘플 내에서 RtlRaiseCustomSystemEventTrigger 함수에 매개 변수로 전달된 GUID는 백그라운드 작업을 만들 때 앱이 등록할 트리거의 식별자를 정의합니다. 이 식별자는 고유해야 합니다.

백그라운드 작업 만들기

백그라운드 작업을 만들고 사용자 지정 트리거에 등록하는 것은 표준 시스템 트리거와 함께 작동하는 백그라운드 작업에 사용되는 프로세스와 매우 유사합니다.

  1. 먼저 UWP 앱을 만듭니다.

  2. 다음 예제와 같이 앱 매니페스트 파일에서 백그라운드 작업을 정의합니다. Task 요소의 Type 특성은 로 설정됩니다."systemEvent"

    <Applications>
      <Application Id="MyBackgroundTaskSample.App" Executable="$targetnametoken$.exe" EntryPoint=" MyBackgroundTaskSample.App">
        <Extensions>
          <Extension Category="windows.backgroundTasks" EntryPoint="MyBackgroundTask.SampleBackgroundTask">
            <BackgroundTasks>
              <Task Type="systemEvent" />
            </BackgroundTasks>
          </Extension>
        </Extensions>
      </Application>
    </Applications>
    
  3. 다음 코드 발췌와 같이 만든 사용자 지정 트리거를 수신 대기하도록 앱을 등록합니다. CustomSystemEventTrigger를 인스턴스화할 때 사용되는 문자열은 네이티브 서비스 또는 디바이스 드라이버에서 트리거를 만들 때 사용되는 GUID와 일치해야 합니다.

    public void InitBackgroundTask()
    {
       // Create a new background task builder.
       BackgroundTaskBuilder taskBuilder = new BackgroundTaskBuilder();
    
       // Create a new CustomSystemEvent trigger.
       var myTrigger = new CustomSystemEventTrigger(
                            "{9118718B-FF80-4AFE-BAF1-D88A4525F3AB}", //Trigger Identifier
                            CustomSystemEventTriggerRecurrence.Once); //OneShot 
    
       // Associate the CustomSystemEvent trigger with the background task builder.
       taskBuilder.SetTrigger(myTrigger);
    
       // Specify the background task to run when the trigger fires.
       taskBuilder.TaskEntryPoint = MyBackgroundTask.SampleBackgroundTask;
    
       // Name the background task.
       taskBuilder.Name = "fabrikam.audio-jack.connected Task";
    
       // Register the background task.
       BackgroundTaskRegistration taskRegistration = taskBuilder.Register();
    
       // Associate completed event handler with the new background task.
       taskRegistration.Completed += new BackgroundTaskCompletedEventHandler(OnCompleted); 
    }
    
  4. 다음 코드 발췌와 같이 백그라운드 작업을 만듭니다.

    namespace MyBackgroundTask
    {
       public sealed class SampleBackgroundTask : IBackgroundTask
       {
          // Called by the system when it's time to run our task
          public void Run(IBackgroundTaskInstance instance)
          {
             DoWork();
          }
       }
    }
    

백그라운드 작업 및 트리거 만들기, 구성 및 작업에 대한 추가 지침은 빠른 시작: 백그라운드 작업 만들기 및 등록을 참조하세요.