none
WP: Background Tasks RRS feed

  • Frage

  • Hallo,

    ich möchte bei einer Windows Phone Anwendung ein Background Task einrichten, um in einem festen Abstand aus dem Internet etwas runterzuladen und zu verarbeiten. So wie ich das verstanden habe, muss man das mit PeriodicTask lösen. Leider schaffe ich das einfach nicht, das richtig einzurichten. Bei dem PeriodicTask kann ich aber keine Wiederholung angeben. (Ich verstehe sowieso nicht, wo ich die "verzögerung" angeben kann) Gibt es Vielleicht eine andere Möglichkeit das zu lösen? Und wenn ja, wie macht man das? Die Msdn-Anleitung hat mir leider nicht geholfen.

     

    Gibt es vielleicht eine andere Lösung?

    Wenn nicht habe ich noch eine Frage zu dem Beispiel von Msdn: Der Task, der dann im Hintergrund ausgeführt wird, ist ja in einem extra Projekt. In dem Code vom Hauptprojekt wird doch aber gar nicht auf das Nebenprojekt verwiesen. Wie funktioiert das ganze dann?

     

     

    Viele Grüße,

    Alex



    • Bearbeitet Ahn1 Donnerstag, 2. Februar 2012 00:27
    • Verschoben Robert Breitenhofer Donnerstag, 2. Februar 2012 08:26 Windows Phone (aus:Silverlight)
    Donnerstag, 2. Februar 2012 00:25

Antworten

  • Ah - ich verstehe. Für genau diesen Fall gibt es doch Push Notifications. Schau dir diese doch mal an.
    This posting is provided "AS IS" with no warranties, and confers no rights.
    • Bearbeitet PeterNowak Freitag, 3. Februar 2012 18:38
    • Als Antwort markiert Ahn1 Montag, 6. Februar 2012 20:28
    Freitag, 3. Februar 2012 18:38

Alle Antworten

  • Hallo Alex,

    >>In dem Code vom Hauptprojekt wird doch aber gar nicht auf das Nebenprojekt verwiesen.

    Dies passiert in Punkt 3 der Anleitung.

    Du solltest Dir vielleicht mal das folgende HOL anschauen. Die Beschreibung der Vorgehensweise ist etwas ausführlicher:

    http://msdn.microsoft.com/en-us/WindowsPhoneTrainingCourse_TodoMultitasking

    Schöne Grüße

    Oliver

    Donnerstag, 2. Februar 2012 08:35
  • Danke für den Link.

     

    Ich habe jetzt noch ein Problem:

    Hier erstmal mein Code:

     

    PeriodicTask periodicTask = null;
                const string c_TaskName = "ReloadSchedulerTask";
    
                periodicTask = new PeriodicTask(c_TaskName);
                periodicTask.Description = "bla bla bla bl";
    
                periodicTask.ExpirationTime = DateTime.Now.AddSeconds(15);
    
                if (ScheduledActionService.Find(c_TaskName) != null)
                    ScheduledActionService.Remove(c_TaskName);
    
                ScheduledActionService.Add(periodicTask);
    
                ScheduledActionService.LaunchForTest(c_TaskName, new TimeSpan(0, 0, 3));
    
    <Tasks>
          <DefaultTask Name="_default" />
          <!--NavigationPage="MainPage.xaml"-->
          <ExtendedTask Name="BackgroundTask">
            <BackgroundServiceAgent Specifier="ScheduledTaskAgent"
                                    Name="ReloadAgent" Source="ReloadAgent"
                                    Type="ReloadAgent.ScheduledAgent" />
          </ExtendedTask>
        </Tasks>
    
    namespace ReloadAgent
    {
        public class ScheduledAgent : ScheduledTaskAgent
        {
            private static volatile bool _classInitialized;
    
            /// <remarks>
            /// ScheduledAgent-Konstruktor, initialisiert den UnhandledException-Handler
            /// </remarks>
            public ScheduledAgent()
            {
                if (!_classInitialized)
                {
                    _classInitialized = true;
                    // Handler für verwaltete Ausnahmen abonnieren
                    Deployment.Current.Dispatcher.BeginInvoke(delegate
                    {
                        Application.Current.UnhandledException += ScheduledAgent_UnhandledException;
                    });
                }
            }
    
            /// Code, der bei nicht behandelten Ausnahmen ausgeführt wird
            private void ScheduledAgent_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
            {
                if (System.Diagnostics.Debugger.IsAttached)
                {
                    // Eine nicht behandelte Ausnahme ist aufgetreten. Unterbrechen und Debugger öffnen
                    System.Diagnostics.Debugger.Break();
                }
            }
    
            /// <summary>
            /// Agent zum Ausführen einer geplanten Aufgabe
            /// </summary>
            /// <param name="task">
            /// Die aufgerufene Aufgabe
            /// </param>
            /// <remarks>
            /// Diese Methode wird aufgerufen, wenn eine regelmäßige oder ressourcenintensive Aufgabe aufgerufen wird
            /// </remarks>
            protected override void OnInvoke(ScheduledTask task)
            {
                //TODO: Code zum Ausführen der Aufgabe im Hintergrund hinzufügen
    
                MessageBox.Show("test");
    
                NotifyComplete();
            }
        }
    }
    

     

    Das Problem ist, dass der Agent nich aufgerufen wird. Weiß jemand wieso?


    • Bearbeitet Ahn1 Donnerstag, 2. Februar 2012 10:55
    Donnerstag, 2. Februar 2012 10:55
  • Darf der Agent überhaupt Ui Elemente (In dem Fall die MessageBox) verwenden? Ich meine nicht, oder?
    This posting is provided "AS IS" with no warranties, and confers no rights.
    Donnerstag, 2. Februar 2012 11:46
  • Unabhängig davon, wird die Funktion gar nicht aufgerufen. (Ich habe ein Haltepunkt gesetzt)
    Donnerstag, 2. Februar 2012 11:48
  • Der wird auch nie ausgeführt werden, wenn das ausführen der Assembly nicht erlaubt ist. Nimm mal die Referenz auf die zugehörige Bibliothek und das Codefragment raus und schaue dann nochmal...
    This posting is provided "AS IS" with no warranties, and confers no rights.
    Donnerstag, 2. Februar 2012 11:50
  • So, die Funktion wird jetzt richtig aufgerufen.

     

    Jetzt habe ich noch eine Frage: Wo kann ich steuern, wie oft der Task ausgefürt wird. Ich möchte ja, dass der Task alle x Minuten ausgeführt wird.

     

    Danke schonmal für eure Hilfe.

    Donnerstag, 2. Februar 2012 16:04
  • Ich habe jetzt gelesen, dass die Periodic Task prinzipiell alle 30 Minuten aufgerufen werden. Leider ist mir das viel zu wenig.

    Gibt es denn noch eine andere Möglichkeit, Task öfter auszuführen?

    Donnerstag, 2. Februar 2012 21:36
  • Hi,

    leider nein. Es gibt nur den PeriodicTask (alle 30 Minuten) oder den ResourceIntensivTask (auslösen bei einem Ereignis). Häufiger ist einfach nicht möglich um den Akku zu schonen. Was willst du damit erreichen? Was ist dein Anwendungsfall?

     

    Gruß, Peter


    This posting is provided "AS IS" with no warranties, and confers no rights.
    Freitag, 3. Februar 2012 17:40
  • Ich bin auf einem Oberstufenzentrum und programmiere eine App, um den aktuellen Stundenplan abzurufen. Wenn sich etwas an dem Stundenplan ändert, soll der Benutzer automatisch benachichtigt werden. Da sich der Stundenplan aber sehr kurzfristig ändern kann, reichen 30 minuten nicht.
    Freitag, 3. Februar 2012 18:35
  • Ah - ich verstehe. Für genau diesen Fall gibt es doch Push Notifications. Schau dir diese doch mal an.
    This posting is provided "AS IS" with no warranties, and confers no rights.
    • Bearbeitet PeterNowak Freitag, 3. Februar 2012 18:38
    • Als Antwort markiert Ahn1 Montag, 6. Februar 2012 20:28
    Freitag, 3. Februar 2012 18:38