2017-03-27 8 views
0

Ich entwickle gerade eine App mit einer Hintergrundaufgabe, die bei einer Zeit ausgelöst werden soll, die vom Benutzer eingestellt wird. Der Benutzer wählt zum Beispiel '01: 45 PM ', die App berechnet die Minuten von jetzt bis zu dieser Zeit und registriert eine Hintergrundaufgabe mit einem Zeittrigger. Leider feuert die Hintergrundaufgabe überhaupt nicht. Manchmal hat es einfach ausgelöst, nachdem ich meinen Computer gestartet habe. Ich bin dankbar für jeden Rat, da ich dieses Problem seit einer Woche nicht lösen kann.UWP Hintergrund Aufgabentimer nicht feuern

Ich bereits debugged die Hintergrundaufgabe, indem Sie es über VisualStudio starten, so ist das Problem nicht in der BackgroundTask.cs-Datei.

Hier ist mein Code:

  • die Hintergrundaufgabe registrieren:

    //I set the time to 15 minutes to see if this would work. It didn't... 
    var trigger = new TimeTrigger(15, true); 
    BackgroundTaskHelper.RegisterBackgroundTask("BackgroundTask.BackgroundTask", "BackgroundTask", trigger, null); 
    
  • Methode, um die Hintergrundaufgabe zu registrieren:

    public static async void RegisterBackgroundTask(string taskEntryPoint, string taskName, IBackgroundTrigger trigger, IBackgroundCondition condition) 
    { 
        foreach (var cur in BackgroundTaskRegistration.AllTasks) 
        { 
         if (cur.Value.Name == taskName) 
         { 
          cur.Value.Unregister(true); 
         } 
        }    
        var builder = new BackgroundTaskBuilder(); 
        builder.Name = taskName; 
        builder.TaskEntryPoint = taskEntryPoint; 
        builder.SetTrigger(trigger); 
    
        if (condition != null) 
        { 
         builder.AddCondition(condition); 
        } 
    
        await BackgroundExecutionManager.RequestAccessAsync(); 
        var task = builder.Register(); 
    } 
    
  • Package.appxmanifest Package.appxmanifest, Image

Vielen Dank für jede Hilfe!

+0

Es kann viele Probleme damit geben. Zwei Dinge, die mir in den Sinn kommen, sind sehr häufig: Wie lange läuft die Hintergrundaufgabe (mehr als 30 Sekunden sind ein Problem mit der Standard-BGTask) und zweitens: Wie hoch ist die CPU-Auslastung für diese Aufgabe und wie hoch war die CPU Nutzung, wann sollte es laufen? Auch das könnte hilfreich sein: https://docs.microsoft.com/en-us/windows/uwp/launch-resume/debug-a-background-task – user3079834

+0

Derzeit wird nur eine Toast-Benachrichtigung gesendet, so dass die Dauer geringer ist als 30 Sekunden und die CPU-Auslastung ist niedrig. – MadMax

+0

Und die CPU-Auslastung, während es zündet?Manchmal wird ein Task nicht ausgelöst, wenn der Hostcomputer eine hohe CPU-Auslastung hat. – user3079834

Antwort

0

Erstellen Sie eine neue TimeTrigger. Der zweite Parameter, OneShot, gibt an, ob die Hintergrundaufgabe nur einmal ausgeführt wird oder regelmäßig ausgeführt wird. Wenn OneShot auf True festgelegt ist, gibt der erste Parameter (FreshnessTime) die Anzahl der Minuten an, die gewartet werden muss, bevor die Hintergrundaufgabe geplant wird. Wenn OneShot auf false festgelegt ist, gibt FreshnessTime die Häufigkeit an, mit der ausgeführt wird.

Wenn FreshnessTime auf 15 Minuten festgelegt ist und OneShot true ist, wird die Task so geplant, dass sie einmal zwischen 15 und 30 Minuten nach der Registrierung ausgeführt wird. Wenn es auf 25 Minuten festgelegt ist und OneShot wahr ist, wird die Task so geplant, dass sie einmal ausgeführt wird und zwischen 25 und 40 Minuten nach der Registrierung beginnt.

So ist die TimeTrigger nicht für Ihr Szenario geeignet. In Windows 10 UWP sind Alarme einfach Toast-Benachrichtigungen mit dem Szenario "Alarm". Um zu einem bestimmten Zeitpunkt einen Alarm anzuzeigen, können Sie eine geplante Toast-Benachrichtigung verwenden.

Der folgende Code beschreibt, wie der Alarm so geplant wird, dass er zu einer bestimmten Zeit erscheint. Details bitte Referenz Quickstart: Sending an alarm in Windows 10. Die begleitende sample application ist eine einfache Quickstart-Alarm-Anwendung.

DateTime alarmTime = DateTime.Now.AddMinutes(1); 

// Only schedule notifications in the future 
// Adding a scheduled notification with a time in the past 
// will throw an exception. 
if (alarmTime > DateTime.Now.AddSeconds(5)) 
{ 
    // Generate the toast content (from previous steps) 
    ToastContent toastContent = GenerateToastContent(); 

    // Create the scheduled notification 
    var scheduledNotif = new ScheduledToastNotification(
     toastContent.GetXml(), // Content of the toast 
     alarmTime // Time we want the toast to appear at 
     ); 

    // And add it to the schedule 
    ToastNotificationManager.CreateToastNotifier().AddToSchedule(scheduledNotif); 
} 
+0

Danke! Das ist sehr interessant! Gibt es eine Möglichkeit, den Inhalt nach der geplanten Zeit zu erhalten? Ich möchte den Inhalt einer Webseite zum geplanten Zeitpunkt überprüfen und eine Benachrichtigung per E-Mail mit Teilen dieser Webseite senden. Gibt es eine Möglichkeit, den Inhalt zu diesem Zeitpunkt dynamisch zu erhalten? – MadMax