uwp
UWP-achtergrondtaken
Zoeken…
Opmerkingen
- Voor het registreren van een achtergrondtaak die in een afzonderlijk proces wordt uitgevoerd, moet u naar het tabblad "Declaraties" in het Package.appxmanifest gaan en een nieuwe "Achtergrondtaak" toevoegen en het invoerpunt instellen.
- Het registreren van een enkelvoudige achtergrondtaak kan worden gedaan met behulp van
BackgroundTaskBuilder, maar de toepassing zal een uitzondering genereren als u twee keer een taak registreert, dus u moet controleren of u al een taak hebt geregistreerd. - De app moet toestemming krijgen om een nieuwe taak te registreren, dit kan worden gedaan door
BackgroundExecutionManager.RequestAccessAsync()aan te roepen, maar zorg ervoor dat u echt de toestemming hebt. De oproep retourneert het type toegang (BackgroundAccessStatusenum) die aangeeft of u toegang hebt of niet. - Geregistreerde taken worden bewaard totdat het pakket wordt verwijderd, maar het doet geen pijn om de taken die u nodig hebt bij elke lancering te controleren, er gebeurt een bug!
- Wanneer de toepassing wordt bijgewerkt, wordt de toestemming om een nieuwe taak te registreren ingetrokken. Om uw app na een update actief te houden, met name als u een nieuw takenregister hebt toegevoegd, moet u de toegang verwijderen en de toegang opvragen via
BackgroundAccessManager. Een methode om te weten of uw app is bijgewerkt, is om een andere taak te registreren met eenSystemTrigger, typeSystemTriggerType.ServicingComplete.
Een taak registreren
/// <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;
}
}
Ontvang een geregistreerde taak met de naam
/// <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;
De taak
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();
}
}
Controleer of Taak is geregistreerd
private bool IsTaskRegistered(string taskName) =>
BackgroundTaskRegistration.AllTasks.Any(x => x.Value.Name.Equals(taskName));
Een taak handmatig activeren
var trigger = new ApplicationTrigger();
TaskHandlerMentionedInThisTutorial.RegisterTask(TaskName, entryPoint, trigger, null, true);
await trigger.RequestAsync();
Een taak afmelden
/// <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);
}
Registreer achtergrondtaak met trigger
De achtergrondtaak is een geweldige manier om wat werk uit te voeren terwijl uw toepassing niet actief is. Voordat u deze kunt gebruiken, moet u ze registreren.
Hier is een voorbeeld van een achtergrondtaakklasse inclusief de registratie met een trigger en een voorwaarde en de Run-implementatie
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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow