Ausführen einer Hintergrundaufgabe für einen Timer

Erfahren Sie, wie Sie timeTrigger verwenden, um eine einmalige Hintergrundaufgabe zu planen oder einen regelmäßigen Hintergrundtask auszuführen.

Unter Szenario4 im Beispiel für die Hintergrundaktivierung finden Sie ein Beispiel für die Implementierung der in diesem Thema beschriebenen zeitauslösten Hintergrundaufgabe.

In diesem Thema wird davon ausgegangen, dass Sie über eine Hintergrundaufgabe verfügen, die regelmäßig oder zu einem bestimmten Zeitpunkt ausgeführt werden muss. Wenn Sie noch keine Hintergrundaufgabe haben, gibt es eine Beispiel-Hintergrundaufgabe unter BackgroundActivity.cs. Führen Sie auch die Schritte unter Erstellen und Registrieren einer prozessinternen Hintergrundaufgabe oder Erstellen und Registrieren einer Hintergrundaufgabe außerhalb des Prozesses aus, um eine Aufgabe zu erstellen.

Erstellen eines Zeitauslösers

Erstellen Sie einen neuen Zeitauslöser (TimeTrigger). Der zweite Parameter (OneShot) gibt an, ob die Hintergrundaufgabe einmalig oder regelmäßig ausgeführt wird. Wenn OneShot auf „true“ festgelegt ist, gibt der erste Parameter (FreshnessTime) an, wie lange mit der Planung der Hintergrundaufgabe gewartet werden soll (in Minuten). Wenn OneShot auf „false“ festgelegt ist, gibt FreshnessTime die Häufigkeit an, mit der die Hintergrundaufgabe ausgeführt wird.

Der integrierte Timer für auf Desktop- oder Mobilgeräte ausgerichtete UWP-Apps führt Hintergrundaufgaben in einem 15-Minuten-Intervall aus. (Der Timer wird in Intervallen von 15 Minuten ausgeführt, sodass das System nur alle 15 Minuten aktiviert werden muss, um die Apps zu reaktivieren, die TimerTriggers angefordert haben– was Strom spart.)

  • Wenn FreshnessTime auf 15 Minuten und OneShot auf „true“ festgelegt ist, wird die Aufgabe einmalig innerhalb der ersten 15 und 30 Minuten nach dem Registrierungszeitpunkt zur Ausführung eingeplant. Wenn sie auf 25 Minuten und OneShot auf „true“ festgelegt ist, wird die Aufgabe einmalig innerhalb der ersten 25 und 40 Minuten nach dem Registrierungszeitpunkt zur Ausführung eingeplant.

  • Wenn FreshnessTime auf 15 Minuten und OneShot auf „false“ festgelegt ist, wird die Aufgabe alle 15 Minuten innerhalb der ersten 15 und 30 Minuten nach dem Registrierungszeitpunkt zur Ausführung eingeplant. Wenn sie auf „n” Minuten und OneShot auf „false“ festgelegt ist, wird die Aufgabe alle „n” Minuten innerhalb der ersten „n” und „n+15” Minuten nach dem Registrierungszeitpunkt zur Ausführung eingeplant.

Hinweis

Wenn FreshnessTime auf weniger als 15 Minuten festgelegt ist, wird beim Registrieren der Hintergrundaufgabe eine Ausnahme ausgelöst.

Dieser Trigger bewirkt beispielsweise, dass eine Hintergrundaufgabe einmal pro Stunde ausgeführt wird.

TimeTrigger hourlyTrigger = new TimeTrigger(60, false);
Windows::ApplicationModel::Background::TimeTrigger hourlyTrigger{ 60, false };
TimeTrigger ^ hourlyTrigger = ref new TimeTrigger(60, false);

(Optional) Hinzufügen einer Bedingung

Sie können eine Hintergrundaufgabe erstellen, um zu steuern, wann der Task ausgeführt wird. Eine Bedingung verhindert, dass die Hintergrundaufgabe ausgeführt wird, bis die Bedingung erfüllt ist. Weitere Informationen finden Sie unter Festlegen von Bedingungen für die Ausführung einer Hintergrundaufgabe.

In diesem Beispiel ist die Bedingung auf UserPresent festgelegt, damit die ausgelöste Aufgabe nur ausgeführt wird, wenn der Benutzer aktiv ist. Eine Liste mit möglichen Bedingungen finden Sie in SystemConditionType.

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);
Windows::ApplicationModel::Background::SystemCondition userCondition{
    Windows::ApplicationModel::Background::SystemConditionType::UserPresent };
SystemCondition ^ userCondition = ref new SystemCondition(SystemConditionType::UserPresent);

Ausführlichere Informationen zu Bedingungen und Typen von Hintergrundtriggern finden Sie unter Unterstützen Ihrer App mit Hintergrundaufgaben.

Aufrufen von RequestAccessAsync()

Rufen Sie vor dem Registrieren der ApplicationTrigger-HintergrundaufgabeRequestAccessAsync auf, um die Ebene der Vom Benutzer zulässigen Hintergrundaktivität zu bestimmen, da der Benutzer möglicherweise die Hintergrundaktivität für Ihre App deaktiviert hat. Weitere Informationen dazu, wie Benutzer die Einstellungen für Hintergrundaktivität steuern können, finden Sie unter Optimieren der Hintergrundaktivität .

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
    // Depending on the value of requestStatus, provide an appropriate response
    // such as notifying the user which functionality won't work as expected
}

Registrieren der Hintergrundaufgabe

Registrieren Sie die Hintergrundaufgabe, indem Sie die Funktion zum Registrieren der Hintergrundaufgabe aufrufen. Weitere Informationen zum Registrieren von Hintergrundaufgaben und zur Definition der RegisterBackgroundTask() -Methode im folgenden Beispielcode finden Sie unter Registrieren einer Hintergrundaufgabe.

Wichtig

Legen Sie für Hintergrundaufgaben, die im selben Prozess wie Ihre App ausgeführt werden, nicht fest entryPoint. Legen Sie entryPoint für Hintergrundaufgaben, die in einem von Ihrer App getrennten Prozess ausgeführt werden, den Namespace "." und den Namen der Klasse fest, die Ihre Implementierung der Hintergrundaufgabe enthält.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example hourly background task";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example hourly background task" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example hourly background task";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);

Parameter für die Registrierung von Hintergrundaufgaben werden zum Zeitpunkt der Registrierung überprüft. Bei ungültigen Registrierungsparametern wird ein Fehler zurückgegeben. Stellen Sie sicher, dass Ihre App problemlos mit Szenarien ohne erfolgreiche Registrierung von Hintergrundaufgaben zurechtkommt. Andernfalls stürzt die App unter Umständen ab, wenn sie so konzipiert ist, dass nach dem Versuch, eine Aufgabe zu registrieren, ein gültiges Registrierungsobjekt vorhanden sein muss.

Verwalten von Ressourcen für Ihre Hintergrundaufgabe

Um zu ermitteln, ob der Benutzer die Hintergrundaktivität Ihrer App begrenzt hat, verwenden Sie BackgroundExecutionManager.RequestAccessAsync. Achten Sie auf die Akkunutzung, und führen Sie Ihre App nur dann im Hintergrund aus, wenn dies zum Ausführen einer vom Benutzer gewünschten Aktion notwendig ist. Weitere Informationen dazu, wie Benutzer die Einstellungen für Hintergrundaktivität steuern können, finden Sie unter Optimieren der Hintergrundaktivität .

  • Arbeitsspeicher: Die Optimierung des Arbeitsspeichers und des Energieverbrauchs Ihrer App ist der Schlüssel, um sicherzustellen, dass das Betriebssystem die Ausführung Ihrer Hintergrundaufgabe zulässt. Verwenden Sie die Speicherverwaltungs-APIs , um zu ermitteln, wie viel Arbeitsspeicher Ihre Hintergrundaufgabe benötigt. Je mehr Arbeitsspeicher Ihre Hintergrundaufgabe benötigt, desto schwieriger ist es für das Betriebssystem, die Ausführung aufrechtzuerhalten, wenn sich eine andere App im Vordergrund befindet. Der Benutzer hat letztendlich die Kontrolle über alle Hintergrundaktivitäten, die Ihre App ausführen kann, und kann die Auswirkungen Ihrer App auf den Akkuverbrauch erkennen.
  • CPU-Zeit: Hintergrundaufgaben werden durch die Menge der Wanduhrnutzungszeit begrenzt, die sie basierend auf dem Triggertyp erhalten.

Die für Hintergrundaufgaben geltenden Ressourcenbeschränkungen finden Sie unter Unterstützen der App mit Hintergrundaufgaben.

Hinweise

Ab Windows 10 ist es nicht mehr erforderlich, dass der Benutzer Ihre App zum Sperrbildschirm hinzufügen muss, um Hintergrundaufgaben zu nutzen.

Eine Hintergrundaufgabe wird nur mithilfe eines TimeTriggers ausgeführt, wenn Sie zuerst RequestAccessAsync aufgerufen haben.