Warum werden meine Bilder manchmal beim Fortsetzen neu geladen (und WriteableBitmaps verschwinden)?

Wenn ich meine App wieder aufnehme, gehen manchmal die Bilder verloren. Das kann ich auch in trivialen Apps wiedergeben.

Dies kann auf zwei verschiedene Arten geschehen, je nachdem, woher das Bild stammt:

Wenn ich so etwas gemacht hätte<Image Source="/Assets/Logo.png"/> (d. h. Laden eines Bildes von meinem App-Paket über URI), das Bild wird kurz ausgeblendet und dann neu geladen. Dies ist leichter zu erkennen, wenn der Bildschirm viele Bilder enthält. Sie werden der Reihe nach neu geladen, sodass ich beobachten kann, wie sich das Bild auf dem Bildschirm bewegt.Wenn ich eine erstellt habeWriteableBitmap und binden Sie es an Image.Source, dann verschwindet die Bitmap vollständig, um nie zurückzukehren.

Ich könnte wahrscheinlich damit leben, wenn ich nur Bilder neu lade (obwohl der Ripple-Effekt unangenehm ist), aber ich mache einiges an dynamischer Bilderzeugung und es ist nicht cool, wenn alle meine WriteableBitmaps verschwinden.

Dies geschieht nicht jedes Mal, wenn die App angehalten und fortgesetzt wird, sondern nur manchmal. Ich habe keinen zuverlässigen Repro-Fall gefunden, aber es scheint, dass je länger er ausgesetzt ist und je mehr andere Dinge ich in der Zwischenzeit tue (Surfen im Web in Desktop Chrome, Spielen von Vollbild-DirectX-Spielen wie TapTiles und Microsoft Minesweeper) Je wahrscheinlicher es ist, dass die Bilder verloren gehen, wenn ich zu meiner App zurückschalte. (Die App istnicht beendet und neu gestartet werden - es ist immer noch die gleiche App-Instanz.)

Ich frage mich, ob es etwas damit zu tun hat, dass Bilder aus dem Videospeicher gelöscht werden. Aber ich habe keine Ahnung, wie ich diese Hypothese testen soll, daher ist es an dieser Stelle nur eine Vermutung.

Bisher habe ich noch keine Möglichkeit gefunden, meinem Programm mitzuteilen, dass WriteableBitmaps verloren gehen. Die Reihenfolge der Ereignisse ist identisch mit einer normalen Unterbrechung und Wiederaufnahme:

Window.Current.Activated wird mit args.WindowActivationState == Deaktiviert ausgelöstWindow.Current.VisibilityChanged wird mit args.Visible == false ausgelöstAnwendung.Aussetzen von Bränden(Zeit vergeht)Anwendung.Wiederaufnahme von BrändenWindow.Current.VisibilityChanged wird mit args.Visible == true ausgelöstWindow.Current.Activated wird mit args.WindowActivationState == CodeActivated ausgelöst

Ich hatte kein Glück bei der Suche nach einem "und übrigens, alle Ihre Bilder gingen weg" -Ereignis.WriteableBitmap hat keine Ereignisse.Bild hat ImageOpened- und ImageFailed-Ereignisse, aber diese werden nur ausgelöst, wenn ich ein Bild von einem URI lade - sie werden nie ausgelöst, wenn Source eine WriteableBitmap ist.

Ich konnte dies in einfachen Apps reproduzieren, sodass es nicht durch eine Bibliothek eines Drittanbieters verursacht wird. Eine leere Seite mit einem von URI geladenen Bild wird ImageOpened erneut auslösen (und das Bild flackert kurz, bevor es neu geladen wird), wenn die App für eine Weile angehalten wurde und Sie es dann fortsetzen. Eine leere Seite mit einem Bild, das mit einer WriteableBitmap initialisiert wurde, verschwindet, wenn die App für eine Weile angehalten wurde, und Sie setzen sie fort.

Wie kann ich den Verlust von WriteableBitmaps (und wenn möglich auch von Content-URI-Images) beheben? Kann ich auf irgendeine Weise verhindern, dass die Bilder überhaupt verloren gehen? Wenn nicht, kann ich dann auf irgendeine Weise feststellen, dass sie verloren gegangen sind, um meine WriteableBitmaps neu zu erstellen?

(Für Bonuspunkte würde ich gerne wissenWarum Die Bilder verschwinden, aber dieser Teil ist völlig optional. Ich habe es längst aufgegeben, zu erwarten, dass WinRT Sinn ergibt.)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage