2013-08-06 2 views
0

Я нахожусь в своем первом приложении для Windows Store, и у меня возникла проблема с десериализацией/загрузкой данных приложения.Deserialization Async File

Я использую JSon для сериализации объекта класса для строки, затем я сохраняю его в папке Local Application Application.

Когда пришло время загрузить данные, один раз за время, когда загрузка не выполняется во время выполнения, и данные не загружаются. и мои классы создаются как новые классы.

Но когда я запускаю свой код, сделайте шаг в режиме отладки. работа 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); 
} 

Нагрузка:

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; 
    } 
} 

ответ

0

Я, наконец, люблю то, что пошло не так. Когда я десериализовал строку, я переводил ее в неправильный тип класса объекта.

6

Вы должны избегать async void. Измените свои методы LoadConfig и Save на методы async Task и получите код для вызова await задание, которое они возвращают.

Одна проблема с async void заключается в том, что вызывающий код не может знать, когда он будет завершен. Например, код, который вызывает LoadConfig, не знает, когда фактически загружена конфигурация. Сделав LoadConfig, верните Task, тогда вызывающий код может await, что Task и знать, что конфигурация загружается, когда эта задача завершается.

+0

Спасибо за ваш ответ, у меня есть async и Task, как вы предлагаете, но это не изменило поведения. Где точнее - лучшее место для вызова процедуры настройки сохранения? В событии «OnSuspending» App.xaml.cs? – Hugo