2012-04-10 5 views
0

Ich habe dieses Problem beim Polieren meiner WP7-Anwendung festgestellt.In WP7 werden Daten nicht sofort nach dem Schreiben in IsolatedStorage gespeichert

Obwohl ich den Microsoft-Richtlinien folge, um den Spielstatus zu speichern, wenn er deaktiviert wird, möchte ich auch einige Daten in Runtime speichern.

Der Grund dafür ist, dass beim Entfernen der Batterie aus dem Gerät keine Deaktivierungs-/Schließungsrückrufe ausgelöst werden.

Das Problem damit kommt, wenn der Benutzer durch das Spiel geht und versehentlich den Akku aus ihrem Gerät entfernt - alle Spielfortschritt ist verloren.

Deshalb speichere ich Spielstatus an einigen Zwischenkontrollpunkten, aber ich habe festgestellt, dass Daten nicht sofort gespeichert werden. Das ist meine Funktion „Speichern“:

public void SaveAppModelToIsolatedStorage() 
    { 
     using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
     using (var stream = new IsolatedStorageFileStream(APPMODEL_DATAFILE, 
                  FileMode.Create, 
                  FileAccess.Write, 
                  store)) 
     { 
      var serializer = new XmlSerializer(typeof(AppModel)); 

      try 
      { 
       serializer.Serialize(stream, AppModel); 
      } 
      catch (Exception ex) 
      { 
       Debug.WriteLine("Cant serialize AppModel:" + ex.Message); 
      } 
     } 
    } 

Nachdem es genannt wurde, wenn ich entfernen Sie den Akku innerhalb einer Anzahl von Sekunden (nicht sicher, wie viele, aber immer weniger als 30), die Anwendung endet mit dem verlorenen Spiel Fortschritte . Wenn ich vor dem Entfernen der Batterie warte, werden die Daten erfolgreich gespeichert. Dieses Verhalten wird auf verschiedenen WP7-Telefonen beobachtet.

Ich versuchte auch Serialisierung in einen String-Puffer und dann schreiben Sie den String-Puffer in die Datei durch den Aufruf stream.Write(), aber das Ergebnis ist das gleiche. Auch scheint stream.Flush() keinen Effekt zu haben.

Ist dieses Verhalten eine Plattformfunktion?

Ist es in Bezug auf Microsoft-Zertifizierung für Marketplace-Apps in Ordnung?

Oder gibt es eine Möglichkeit, Daten sofort zu speichern?

+0

„Ist es in Ordnung in Bezug auf die Microsoft-Zertifizierung für Marketplace-Apps“ calling -> Du sollst nicht diesen Fall behandeln, also keine Sorge über die Zertifizierung. –

+0

Sie sagen "Nachdem es aufgerufen wurde" - überprüfen Sie, ob die Methode tatsächlich ausgeführt wurde? Es kann nicht so schnell abgeschlossen werden, wie Sie denken. –

Antwort

0

Dies kann in Bezug auf die Leistung von Isolated Storage interessant sein: forums.create.msdn.com/forums/p/71708/71708.aspx

+0

Vielen Dank für die Antwort. Ich bin in Ordnung mit der langsamen Leistung von Isolated Storage. Es wäre jedoch besser, wenn der Speichervorgang synchron ausgeführt wird oder zumindest ein Rückruf ausgeführt wird, wenn er abgeschlossen ist. Mit meiner aktuellen Implementierung tut es beides nicht. – mbakulin

2

stream.Close Rufen Sie, wenn Sie Ihre Daten spülen müssen.

Versuchen Sie auch, stream.Flush(true);

+0

Die Dispose im Stream sollte den gleichen Effekt haben. –

+0

Vielen Dank für Ihren Tipp. Ich habe beides explizit ohne Wirkung versucht. Und die Anweisung 'using' stellt sicher, dass stream.Dispose() implizit aufgerufen wird. Und gemäß MSDN wird durch das Ablegen von IsolatedStorageFileStream der Stream geschlossen. – mbakulin

Verwandte Themen