异步文件反序列化

Hug*_*ugo 0 c# wpf async-await microsoft-metro windows-store-apps

我是我的第一个Windows应用商店应用程序,我遇到了反序列化/加载我的应用程序数据的问题.

我正在使用JSon将我的类对象序列化为字符串,然后我将其保存到Application Local App文件夹.

当需要加载数据时,曾几何时加载在运行时失败,并且没有加载数据.我的类被实例化为一个新类.

但是,当我运行我的代码时,我步进调试模式.Desirialization工作正常,我的类正确加载.

我认为问题来自我的异步实现.但我不知道在哪里.

有人能帮我吗?

保存程序:

public virtual void Save()
{
     var data = JsonConvert.SerializeObject(this);
     WriteTotextFileAsync("Cashier.Data.Config", data);
}

public static async void WriteTotextFileAsync(string fileName, string contents)
{
     var folder = ApplicationData.Current.LocalFolder;
     var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
     await FileIO.WriteTextAsync(file, contents);
}
Run Code Online (Sandbox Code Playgroud)

装载程序:

private async void LoadConfig()
{
    string data;
    if (Config == null)
    {
        data = await ReadTextFileAsync("Cashier.Data.Config");//.ConfigureAwait(false);
        if (data != null && data.Length > 0)
            try
            {
                System.Diagnostics.Debug.WriteLine(data);
                Config = JsonConvert.DeserializeObject<Data.Config>(data);
                System.Diagnostics.Debug.WriteLine(data);
            }
            catch (Exception ex)
            {
                var dlg = new MessageDialog("Desirialization erreur" + Environment.NewLine + ex.Message);
                dlg.ShowAsync();
                Config = new Config();
            }
        else
        {
            System.Diagnostics.Debug.WriteLine("Config = new Config();");
            Config = new Config();
        }
    }
}

public static async Task<string> ReadTextFileAsync(string path)
{
    var folder = ApplicationData.Current.LocalFolder;
    try
    {
        var file = await folder.GetFileAsync(path);
        var value = await FileIO.ReadTextAsync(file);
        return value;
    }
    catch (System.IO.FileNotFoundException ex)
    {
        return string.Empty;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 6

你应该避免async void.将您的方法LoadConfigSave方法更改为async Task方法,并将您的调用代码await作为返回的任务.

一个问题async void是调用代码无法知道它何时完成.例如,调用的代码LoadConfig不知道配置何时实际加载.通过使LoadConfig返回Task,然后调用代码可以awaitTask,知道这个任务完成时的配置被加载.