수색…


비고

  • 별도의 프로세스에서 실행되는 백그라운드 작업을 등록하려면 Package.appxmanifest의 "Declarations"탭으로 이동하여 새로운 "Background Task"를 추가하고 엔트리 포인트를 설정해야합니다.
  • 단일 프로세스 백그라운드 작업 등록은 BackgroundTaskBuilder 하여 수행 할 수 있지만 작업을 두 번 등록하면 응용 프로그램에서 예외가 발생하므로 이미 작업을 등록했는지 확인해야합니다.
  • 응용 프로그램은 새로운 작업을 등록 할 수있는 권한을 가져야합니다.이 작업은 BackgroundExecutionManager.RequestAccessAsync() 를 호출하여 수행 할 수 있지만 실제로 권한이 있는지 확인하십시오. 이 호출은 액세스 권한이 있는지 여부를 나타내는 액세스 유형 ( BackgroundAccessStatus enum)을 반환합니다.
  • 등록 된 작업은 패키지가 제거 될 때까지 유지되지만 매번 실행될 때마다 필요한 작업을 확인하지 않아도됩니다.
  • 응용 프로그램이 업데이트되면 새 작업을 등록 할 수있는 권한이 취소됩니다. 특히 새 작업 등록기를 추가 한 경우 업데이트 후 앱을 계속 실행하려면 BackgroundAccessManager 하여 액세스제거하고 액세스를 요청해야합니다 . 앱이 업데이트되었는지 확인하는 한 가지 방법은 다른 작업을 SystemTrigger 유형 ( SystemTriggerType.ServicingComplete 유형)으로 등록하는 것입니다.

작업 등록

/// <summary>
/// Registers a background task in the system waiting to trigger
/// </summary>
/// <param name="taskName">Name of the task. Has to be unique</param>
/// <param name="taskEntryPoint">Entry point (Namespace) of the class (has to implement IBackgroundTask and has to be in a Windows Runtime Component) to start</param>
/// <param name="trigger">What has to be triggered to start the task</param>
/// <param name="condition">Optional condition. Can be null</param>
/// <param name="recreateIfExists">Should the Task be recreated if it already exists?</param>
/// <returns></returns>
public BackgroundTaskRegistration RegisterTask(string taskName, string taskEntryPoint, IBackgroundTrigger trigger, IBackgroundCondition condition = null) {
    Debug.WriteLine("Try registering task: " + taskName);

    var builder = new BackgroundTaskBuilder {
        Name = taskName,
        TaskEntryPoint = taskEntryPoint
    };

    builder.SetTrigger(trigger);

    if (condition != null) {
        builder.AddCondition(condition);
    }

    try {
        var task = builder.Register();
        Debug.WriteLine("Task successfully registered");
        return task;
    } catch (Exception exception) {
        Debug.WriteLine("Error creating Task: " + exception);
        return null;
    }
}

이름으로 등록 된 작업 가져 오기

/// <summary>
/// Gets a BackgroundTask by its name
/// </summary>
/// <param name="taskName">Name of the task to find</param>
/// <returns>The found Task or null if none found</returns>
public BackgroundTaskRegistration TaskByName(string taskName) =>
       BackgroundTaskRegistration.AllTasks.FirstOrDefault(x => x.Value.Name.Equals(taskName)).Value as BackgroundTaskRegistration;

작업

public sealed class BackgroundTask : IBackgroundTask {

    private BackgroundTaskDeferral _deferral;

    /// <summary>
    /// Registers the listener to check if the button is pressed
    /// </summary>
    /// <param name="taskInstance">An interface to an instance of the background task. The system creates this instance when the task has been triggered to run.</param>
    public async void Run(IBackgroundTaskInstance taskInstance) {
        _deferral = taskInstance.GetDeferral();

        //Do async operations here

        _deferral.Complete();
    }
}

작업 등록 여부 확인

private bool IsTaskRegistered(string taskName) =>
        BackgroundTaskRegistration.AllTasks.Any(x => x.Value.Name.Equals(taskName));

수동으로 작업 트리거

var trigger = new ApplicationTrigger();
TaskHandlerMentionedInThisTutorial.RegisterTask(TaskName, entryPoint, trigger, null, true);    
await trigger.RequestAsync();

할 일 목록 등록 해제하기

/// <summary>
/// Unregister a single background task with given name
/// </summary>
/// <param name="taskName">task name</param>
/// <param name="cancelTask">true if task should be cancelled, false if allowed to finish</param>
public void UnregisterTask(string taskName, bool cancelTask) =>
    BackgroundTaskRegistration.AllTasks.First(x => x.Value.Name.Equals(taskName)).Value?.Unregister(cancelTask);

/// <summary>
/// Unregister an active group of background tasks, which name contains given string
/// </summary>
/// <param name="taskNamePart">part of the task name</param>
/// <param name="cancelTask">true if tasks should be cancelled, false if allowed to finish</param>
public void UnregisterTasks(string taskNamePart, bool cancelTask)
{
    foreach (var task in BackgroundTaskRegistration.AllTasks.Where(x => x.Value.Name.Contains(taskNamePart)))
        task.Value.Unregister(cancelTask);
}

트리거로 백그라운드 작업 등록

백그라운드 작업은 응용 프로그램이 실행되지 않는 동안 작업을 수행하는 좋은 방법입니다. 그 때 사용할 수 있기 전에, 당신은 그 (것)들을 등록해야 할 것이다.

다음은 트리거 및 조건 등록 및 실행 구현을 포함하는 백그라운드 작업 클래스의 샘플입니다

public sealed class Agent : IBackgroundTask
{    
    public void Run(IBackgroundTaskInstance taskInstance)
    {
        // run the background task code
    }
    
    // call it when your application will start.
    // it will register the task if not already done
    private static IBackgroundTaskRegistration Register()
    {
        // get the entry point of the task. I'm reusing this as the task name in order to get an unique name
        var taskEntryPoint   = typeof(Agent).FullName;
        var taskName         = taskEntryPoint;
        
        // if the task is already registered, there is no need to register it again
        var registration            = BackgroundTaskRegistration.AllTasks.Select(x => x.Value).FirstOrDefault(x => x.Name == taskName);
        if(registration != null) return registration;
                        
        // register the task to run every 30 minutes if an internet connection is available
        var taskBuilder             = new BackgroundTaskBuilder();
        taskBuilder.Name            = taskName;
        taskBuilder.TaskEntryPoint  = taskEntryPoint;
        taskBuilder.SetTrigger(new TimeTrigger(30, false));
        taskBuilder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));
        
        return taskBuilder.Register();
    }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow