Suche…


Bemerkungen

  • Um eine Hintergrundaufgabe zu registrieren, die in einem separaten Prozess ausgeführt wird, müssen Sie im Package.appxmanifest auf die Registerkarte "Deklarationen" gehen, eine neue "Hintergrundaufgabe" hinzufügen und den Einstiegspunkt festlegen.
  • Das Registrieren einer Einzelprozess-Hintergrundaufgabe kann mithilfe von BackgroundTaskBuilder werden. Die Anwendung löst jedoch eine Ausnahme aus, wenn Sie eine Aufgabe zweimal registrieren. Sie müssen also prüfen, ob Sie bereits eine Aufgabe registriert haben.
  • Die App muss die Berechtigung zum Registrieren einer neuen Aufgabe erhalten. Dies kann durch Aufrufen von BackgroundExecutionManager.RequestAccessAsync() erfolgen. Stellen Sie jedoch sicher, dass Sie wirklich über die Berechtigung verfügen. Der Aufruf gibt den Zugriffstyp zurück ( BackgroundAccessStatus Enum), der angibt, ob Sie Zugriff haben oder nicht.
  • Die registrierten Aufgaben bleiben bis zur Deinstallation des Pakets erhalten. Es kann jedoch nicht schaden, die erforderlichen Aufgaben bei jedem Start zu überprüfen. Ein Fehler tritt auf!
  • Wenn die Anwendung aktualisiert wird, wird die Berechtigung zum Registrieren einer neuen Aufgabe widerrufen. Damit Ihre App nach einem Update weiter ausgeführt werden kann, insbesondere wenn Sie ein neues Aufgabenregister hinzugefügt haben, müssen Sie den Zugriff über BackgroundAccessManager entfernen und den Zugriff erneut anfordern . Wenn Sie wissen SystemTrigger , ob Ihre App aktualisiert wird, müssen Sie eine andere Aufgabe mit einem SystemTrigger Typ ( SystemTriggerType.ServicingComplete .

Eine Aufgabe registrieren

/// <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;
    }
}

Erhalten Sie eine registrierte Aufgabe nach ihrem Namen

/// <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;

Die Aufgabe

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();
    }
}

Prüfen Sie, ob die Aufgabe registriert ist

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

Task manuell auslösen

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

Aufheben der Registrierung einer Aufgabe

/// <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);
}

Hintergrundaufgabe mit Trigger registrieren

Die Hintergrundaufgabe ist eine großartige Möglichkeit, um einige Arbeiten auszuführen, während Ihre Anwendung nicht ausgeführt wird. Bevor Sie dann verwenden können, müssen Sie sie registrieren.

Hier ist ein Beispiel für eine Hintergrund-Task-Klasse, einschließlich der Registrierung mit einem Trigger und einer Bedingung sowie der Implementierung von Run

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow