在退出Windows Phone 8.1(通用应用程序)上保存数据

时间:2014-10-22 17:17:41

标签: c# win-universal-app

我有一个关于在Windows Universal Apps 8.1中保存/加载数据的问题。

退出应用时,我似乎无法保存数据。我对序列化的调用是在App.xaml.cs中的OnSuspending方法中完成的,但我不认为每当我关闭应用程序时都会调用它。

它有时会保存数据,有时则不会。这是我的OnSuspending和Save方法的代码。

private void OnSuspending(object sender, SuspendingEventArgs e)
        {
            var deferral = e.SuspendingOperation.GetDeferral();
            // TODO: Save application state and stop any background activity
            Debug.WriteLine("SUSPENDING");
            HabitManager.HabitSerializer.Save();
            deferral.Complete();
        }


public async static void Save()
    {
        Debug.WriteLine("SAVED");
        var json = JsonConvert.SerializeObject(HabitList.Instance.GetHabits());
        var habits = HabitList.Instance.GetHabits();
        foreach (var h in habits)
        {
            Debug.WriteLine("S: " + h);
        }
        StorageFile saveFile = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
        await Windows.Storage.FileIO.WriteTextAsync(saveFile, json);

    }

所以我的问题是,可能是什么问题,如果这不是一个好的序列化机制,你能建议我一个更好的吗?谢谢

1 个答案:

答案 0 :(得分:2)

您的OnSuspending调用在保存调用完成之前返回。

更改保存以返回任务,以便您可以等待它:

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    // TODO: Save application state and stop any background activity
    Debug.WriteLine("SUSPENDING");
    // Wait fir Save to finish its a sync operations
    await HabitManager.HabitSerializer.Save();
    deferral.Complete();
}

public async static Task Save()
{
    // Same save code
}

测试悬架时也要小心。应用程序在调试时不会正常暂停,但VS提供了一个暂停按钮来模拟暂停过程。