2017-03-22 3 views
1

Timer Hintergrund Aufgabe in meinem Windows Phone 8.1 App wurde nur gefeuert, wenn App im Debug-Modus von Visual Studio ausgeführt wurde. Aber wenn ich sogar debuggen binär ohne Debugging starte, funktioniert es nicht, nicht nach 15 Minuten, nicht nach mehreren Stunden. Ich testete es auf Windows Phone 8.1 Emulator und auf Nokia Lumia 920 - das gleiche Ergebnis: in Debug-Sitzung funktioniert es (es wird vom System ausgelöst und ich kann es manuell aus Debug-Toolbar auslösen), aber wenn App manuell gestartet passiert nichts.Windows Phone App 8.1 - Hintergrund Aufgabe wird nicht gestartet

Ich habe Windows Store App auch und Zeit Hintergrund Aufgabe funktioniert in ihm ziemlich gut.

Hintergrundaufgaben nutzen zu können, habe ich folgendes:

  1. In meinem wp8.1 Projekt Manifest Ich habe hinzugefügt:

    <Extension Category="windows.backgroundTasks" EntryPoint="data.TimerHandler"> 
         <BackgroundTasks> 
           <Task Type="timer" /> 
         </BackgroundTasks> 
    </Extension> 
    
  2. Erstellt im Namensraum 'data' Klasse MyTimerManager mit solchen Methoden (ua):

    public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint, string taskName, IBackgroundTrigger trigger, IBackgroundCondition condition) 
    { 
        foreach (var cur in BackgroundTaskRegistration.AllTasks) 
        { 
         if (cur.Value.Name == taskName) 
          return (BackgroundTaskRegistration)(cur.Value); 
        } 
        var builder = new BackgroundTaskBuilder(); 
        builder.Name = taskName; 
        builder.TaskEntryPoint = taskEntryPoint; 
        builder.SetTrigger(trigger); 
        if (condition != null) 
         builder.AddCondition(condition); 
        BackgroundTaskRegistration task = null; 
        try 
        { 
         task = builder.Register(); 
        } 
        catch (Exception e) 
        { 
         LogError(e); 
        } 
        return task; 
    } 
    
    public static bool UnRegisterBackgroundTask(string taskName) 
    { 
        foreach (var cur in BackgroundTaskRegistration.AllTasks) 
        { 
         if (cur.Value.Name == taskName) 
         { 
          ((BackgroundTaskRegistration)cur.Value).Unregister(false); 
          return true; 
         } 
        } 
        return false; 
    } 
    
    public static void setupAlarm() 
    { 
        TimeTrigger timerTrigger = new TimeTrigger(30, false); 
        string entryPoint = "data.TimerHandler"; 
        string taskName = "TimerHandler task"; 
        UnRegisterBackgroundTask(taskName);//just in case 
        BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, timerTrigger, null); 
        Log("RegisterBackgroundTask: " + (task!=null ?task.Name:null)); 
    } 
    
  3. Erstellt WinRT Komponente proj ect, setzen Sie den Standard-Namespace auf ‚Daten‘ (im Haupt App die gleichen Namensraum, die ich für die Klasse MyTimerManager verwendet) hinzugefügt Klasse timerhandler:

    namespace data 
    { 
    public sealed class TimerHandler : IBackgroundTask 
    { 
        BackgroundTaskDeferral deferral = null; 
    
        public async void Run(IBackgroundTaskInstance taskInstance) 
        { 
         deferral = taskInstance.GetDeferral(); 
         await BackgroundExecutionManager.RequestAccessAsync(); 
         await backgroundTimerCallAsync(); 
         deferral.Complete(); 
        } 
        public static async Task backgroundTimerCallAsync() 
        { 
         NotificationSender ns = new NotificationSender(false, null, null); 
         ns.sendNotification("Timer task msg");//my code which sends notification 
        } 
    } 
    } 
    
  4. Added Referenzkomponente Projekt in mein wp8.1 Projekt WinRT.

Es ist sehr wichtig, den gleichen Namensraum zu verwenden: in meiner Windows Store 8.1 app Hintergrund-Task wurde nicht ausgelöst, bis ich das realisiert. Und kein einziges Wort darüber in MSFT-Dokumenten!

Bei jedem App-Start rufe ich setupAlarm() auf und im Log sehe ich den Namen der Aufgabe (alles war in Ordnung). Aber dann passiert nichts. Wenn ich diese Aufgabe manuell (von Lifecircle Events Kontrolle) starte, sehe ich meine Benachrichtigung. Das Merkwürdige, an das ich mich vor Monaten erinnerte, als dieser Code geschrieben wurde, sah ich Benachrichtigungen. Ich habe alles mit msft docs überprüft, aber alles scheint gut. Was sollte ich noch tun, um Aufgaben zu entlassen?

Antwort

0

In einigen Beispielen habe ich herausgefunden, dass Sie RequestAccessAsync VOR der Registrierung Ihrer Aufgaben aufrufen sollten! Das hat den Trick gemacht.

Vor bedeutet, dass Sie warten müssen, bis RequestAccessAsync fertig, ich hatte es in sync-Code aufzurufen, also tat ich es so:

BackgroundExecutionManager.RequestAccessAsync.AsTask().ContinueWith(
     (t) => registerMyTasks()).ConfigureAwait(false);