2016-02-20 4 views
5

Meine Hintergrundaufgabe dauert sehr lange, und das Betriebssystem bringt sie einfach zum Absturz. Ich versuche, meine Kontakte online zu synchronisieren, ist hier, was ich tue:Windows Phone 8.1-Hintergrundaufgabe wird vor der Fertigstellung geschlossen

  1. alle Kontakte aus dem Telefonbuch Get (dauert ca. 1 Sekunde)

  2. sie auf einen Server hochladen (~ 2 Sekunden)

  3. Rufen Sie alle Kontakte vom Server (~ 2-3 Sekunden)

  4. alle Kontakte aus ContactStore- löschen (ContactStore.DeleteAsync dauert manchmal 1 Minute bis vollständig)

  5. eine ContactStore- erstellen und alle Kontakte importieren) (~ 1-2 Minuten für 1000 Kontakte)

Ich habe ~ 100 Kontakte und es funktioniert gut, aber ich wollte mit ~ 1000 Kontakte testen und es doesn fülle nicht jedes Mal aus. Ich benutze einen MaintenanceTrigger, aber ich denke, es ist immer noch zu viel für eine Hintergrundaufgabe, aber ich brauche eine Bestätigung dafür. MaintenanceTrigger-Aufgaben sollten mehr ressourcenintensive Aufgaben ausführen können. Warum also bringt das Betriebssystem meine Hintergrundaufgabe um?

+2

Wirklich schwer zu beantworten, ohne etwas Code zu sehen. Die Sache, die Ihnen in den Sinn kommt, ist vielleicht, dass Ihre Hintergrundaufgabe zu viel CPU, Speicher oder zu lange benötigt, um das Telefon zu beenden. –

+0

Wenn ich einen Wartungstrigger verwende, sollte die Aufgabe abgeschlossen sein, auch wenn es benötigt viel Zeit? Das Telefon wird aufgeladen, so dass es kein Problem sein sollte, wenn es eine ressourcenintensive Aufgabe ist. – thewindev

+0

@thewindev Bitte bearbeiten Sie Ihre Frage um klar zu machen, dass es nicht 1-2 Minuten für 1000 Kontakte ... aber 12 Minuten wie Sie später hingewiesen aus ... Ihre Frage ist irreführend und verwirrend für zukünftige Leser. –

Antwort

3

Werfen Sie einen Blick auf diesen Link: https://msdn.microsoft.com/en-us/library/windows/apps/hh202942(v=vs.105).aspx

intensive Ressourcen Aufgaben beschränkt sind auf eine Dauer von 10 Minuten.

Die folgenden Bedingungen müssen erfüllt sein, bevor die Task gestartet wird. Wenn das Gerät diese Einschränkungen nicht mehr erfüllt, wird der Agent sofort beendet.

  • Externe Stromversorgung erforderlich
  • Nichtmobilfunkverbindung erforderlich
  • Mindestbatterieleistung
  • Gerätebildschirmsperre erforderlich
  • keinen aktiven Anruf
  • nicht-Netzwerk zellulären
ändern kann

Daneben gibt es auch eine Speicherkappe von jeweils 11 MB und 20 MB für Low/High-End-Geräte.

Aus Ihrer Beschreibung oben das wahrscheinlichste Szenario IMO ist die Speicherabdeckung getroffen wird. How to get memory available or used in C#

Key Änderungen an Speichergrenzen ab Windows Phone 8.1 enthalten (gefunden here):

  • Alle Windows Phone 8 Vordergrund Anwendungen sind Vielleicht kann dieser Beitrag, den Sie schauen in die Aufgabe der Speichernutzung Ihres Hintergrund helfen gleich behandelt. Wir haben nicht mehr unterschiedliche Speicherkapazitäten für XNA-, native oder Silverlight-Apps.
  • Windows Phone 8.1-Apps (einschließlich Silverlight 8.1 und Windows Runtime) haben etwas höhere Caps als Windows Phone 8-Apps.
  • Speicherkappen für alle App-Typen, einschließlich kontinuierlicher Hintergrundausführung (Continuous Background Execution, CBE), skalieren mit erhöhtem Speicher.
  • Es gibt keine "Standard" und "höhere" Cap - es gibt nur die Standard-Cap.
  • Der Manifesteintrag ID_FUNCCAP_EXTEND_MEM wird für alle unter Windows Phone 8.1 ausgeführten Apps ignoriert.
  • Der Manifest-Eintrag ID_REQ_MEMORY_300 ist noch gültig, aber Sie sollten Ihre App wirklich auf allen Geräten ausführen lassen.
  • Das neue Äquivalent von ID_REQ_MEMORY_300 ist unten. Dieser Eintrag sollte dem AppX-Manifest hinzugefügt werden (nicht dem WMAppManifest).
+0

Meine App ist für WP 8.1, nicht WP 8, so denke ich, dass die Speicheranforderungen gestiegen sind. Wie auch immer, meine Aufgabe verbraucht maximal 12 MB, und mein Gerät ist ein Lumia 930, das auf dem neuesten Build von Windows 10 läuft. Alle diese Einschränkungen sind erfüllt. Ich habe vergessen zu sagen, dass manchmal die Aufgabe beendet ist und manchmal nicht. – thewindev

+0

Ich bin mir nicht sicher, dass das Speicherlimit erhöht ist. Ich konnte keine aktualisierte Dokumentation finden, die besagt, dass sich für Windows Phone 8.1 etwas geändert hat. –

+0

@thewindev "Sie können das für Ihre App verfügbare Speicherlimit überprüfen, indem Sie den Wert ApplicationWorkingSetLimit mit der Methode DeviceExtendedProperties.GetValue (String) überprüfen. Ein Beispiel hierfür finden Sie unter Deaktivieren von Funktionen in Apps für Telefone mit niedrigerem Speicher für Windows Phone 8. " Genommen von https://msdn.microsoft.com/en-us/library/windows/apps/jj681682%28v=vs.105%29.aspx –

1

erm ... vielleicht albern, aber ...

„Hintergrundaufgaben, die einen Wartungstriggerlauf nur verwenden, wenn das System an das Stromnetz angeschlossen ist.“ Genommen von MSDN

Konnte es in das Hauptnetz angeschlossen werden, wenn es funktioniert? Und nicht angeschlossen, wenn es nicht funktioniert?

EDIT: Überlegen Sie, wie beschäftigt das Telefon ist, wenn Sie versuchen, Kontakte zu synchronisieren? Erzwingen Sie, dass die App im Hintergrund immer über Battery Saver läuft?

Sie könnten etwas tun, um zu sehen, wie beschäftigt Ihr Telefon ist ... oder es könnte die Batteriespar stoppen Ihre Anwendung, wenn Grenzen Download-Größe usw. erreicht werden ...

von hier genommen ...

var result = await BackgroundExecutionManager.RequestAccessAsync(); 

if (result == BackgroundAccessStatus.Denied) 
{ 
    // Handle this if it is important for your app. 
} 

„wenn das Ergebnis verweigert wird das Telefon denkt, dass es zu viel Hintergrund-Task aktiv ist. in diesem Fall können Sie Ihre Benutzer dazu auffordern, können die Batteriespar Anwendung zu gehen und lassen Sie zwingen die App im Hintergrund laufen zu lassen, auch wenn das Telefon will nicht ... "

+0

nicht albern :) aber die Aufgabe löst nicht aus, wenn es nicht an Wechselstrom ist, so ist dies nicht das Problem – thewindev

+0

@thewindev Siehe bearbeiten –

+0

@thewindev Auch dies kann einige Einblicke für Sie https: //code.msdn. microsoft.com/windowsapps/Background-Transfer-Sample-d7833f61/ –

3

Schließlich wurde meine Aufgabe mit dem Grund ExecutionTimeExceeded abgebrochen, daher ist dies das Problem. Es scheint, dass der Versuch, ~ 1000 Kontakte im ContactStore zu importieren, ~ 12 Minuten dauert, was für eine Hintergrundaufgabe zu lang ist. Ich muss den Benutzer dazu bringen, die App zu öffnen und den Import durchzuführen. Danke für Ihre Hilfe.

+0

Wenn Sie uns gesagt haben, dass es 12 Minuten dauerte, anstatt zu sagen, dass es 3 Minuten dauerte, wäre dies der offensichtliche Grund gewesen. Der Link, den ich in meiner Antwort gebe, gibt maximal 10 Minuten als Einschränkung an. –

+0

Sie haben Recht, ich habe nicht die ganze Seite gelesen, weil es für Windows Phone 8 war Ich werde Ihre Antwort akzeptieren und Ihnen das Kopfgeld geben :) – thewindev