2016-07-27 4 views
2

Ich denke, der Titel ist selbsterklärend: Ich habe Mühe, jeden Tag um Mitternacht eine Hintergrundaufgabe auszulösen. Die Aufgabe wird ordnungsgemäß mit einem TimeTrigger registriert, dem Manifest hinzugefügt, aber das Ergebnis variiert, manchmal wird es nur am Telefon ausgelöst, manchmal nur am PC, manchmal auch gar nicht.Wie man jeden Tag um Mitternacht im UWP-Code einen Code ausführt?

Bitte sagen Sie mir, was ist der richtige Weg, es zu tun. Ich habe alles in meiner App beendet außer diesem.

Vielen Dank im Voraus.

Edit: Die Art, wie ich es jetzt mache, verwendet 2 Hintergrundaufgaben: Jeder verwendet einen TimeTrigger, der erste wird einmal um Mitternacht ausgeführt, und sein einziger Zweck ist, den zweiten alle 24 Stunden zu planen. Aber wie gesagt, es funktioniert nicht wie erwartet.

Antwort

2

OS können die Hintergrundaufgabe mit oder ohne Ankündigung kündigen/beenden. Zum Beispiel ... Wenn Sie eine 15-Minuten-intervallierte bgtask registrieren und die Aufgabenlöschung implementieren, sehen Sie möglicherweise, dass die Aufgabe mehrmals innerhalb eines Tages abgebrochen wird.

Meine Empfehlung ist ... Versuchen Sie, die bgtask mehrmals innerhalb der 'Mitternacht' zu laufen, um die Aufgabenlöschung zu umgehen.

  1. Implementieren Sie die Stornierung an Ihrem bgtask.
  2. Registrieren Sie Ihre Aufgabe mit 1-Stunden-Intervall.
  3. Am Anfang der Aufgabe, überprüfen Sie die Zeit und Flagge, und tun Sie die Aufgabe, wenn die Zeit ist "Mitternacht" und das Flag ist nicht festgelegt.
  4. Setzen Sie das Flag 'done' auf localsettings.

Details der Hintergrundauslöschung ist hier. https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/handle-a-cancelled-background-task

Und meine Antwort kann er hilft Ihnen Timetrigger not firing backgroundtask UWP

Hier ist eine meiner Implementierung von bgtask. Es unterstützt die Stornierung.

public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     string dbgout = ""; 
     var startTime = DateTime.Now; 
     dbgout += "BgTask "; 

     var cost = BackgroundWorkCost.CurrentBackgroundWorkCost; 
     var cancel = new System.Threading.CancellationTokenSource(); 
     taskInstance.Canceled += (s, e) => 
     { 
      dumpLog("Canceled."); 
      cancel.Cancel(); 
      cancel.Dispose(); 
     }; 


     try 
     { 
      _deferral = taskInstance.GetDeferral(); 

      dbgout += cost.ToString() + " "; 

      switch (cost) 
      { 
       case BackgroundWorkCostValue.Low: 
       case BackgroundWorkCostValue.Medium: 
        await TimeConsumedTaskLowMidAsync().AsTask(cancel.Token); 
        break; 
       case BackgroundWorkCostValue.High: 
        await TimeConsumedTaskHighAsync().AsTask(cancel.Token); 
        break; 
       default: 
        break; 
      } 

     } 
     catch (Exception e) 
     { 
      dbgout += ("Failed " + e.Message + "..."); 
     } 
     finally 
     { 
      dumpLog(dbgout + " " + (DateTime.Now - startTime).TotalSeconds.ToString("F1")); 
      _deferral.Complete(); 
     } 

    } 
+0

danke mate! Ich akzeptiere deine Antwort, auch wenn ich wütend bin, dass ein Entwickler die Hintergrundaufgabe nicht zu einem bestimmten Zeitpunkt so einfach planen kann wie die offizielle Alarm-App. Und ich erinnere mich an kein einziges Mal, dass ein Alarm abgebrochen wurde. Microsoft sollte Entwicklern wirklich mehr Power geben. Es ist Schande. Danke noch einmal. Ich werde deine Idee für ein paar Tage ausprobieren und sehen. –

-2

Wie viele variiert?

Der erste Gedanke, den ich im Sinn habe, ist ein Timer, der alle 1/5 Minuten überprüft die Zeit und wenn es 0:00 ist, eine Funktion auszuführen. Natürlich sollten Sie den Timer zuerst mit einer "aktuellen Zeit synchronisieren Kontrolle“beim Start ..

aber ist nur die erste Idee, die ich habe ..

Verwandte Themen