2013-08-06 3 views
0

저는 처음으로 Windows Store App에 있었으며 Deserialization/내 응용 프로그램 데이터로드와 관련된 문제가 있습니다.비동기 파일 비 직렬화

JSon을 사용하여 클래스 객체를 문자열로 직렬화 한 다음 응용 프로그램 로컬 응용 프로그램 폴더에 저장합니다.

데이터를로드 할 시간이되면 실행시로드가 실패하고 데이터가로드되지 않습니다. 내 수업은 새로운 수업으로 인스턴스화됩니다.

하지만 내 코드를 실행할 때 내 단계가 디버그 모드로 진행됩니다. 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

나는 결국 무엇이 잘못되었는지 잘 알고 있습니다. 문자열을 deserialize 할 때 잘못된 객체 클래스 유형으로 캐스팅했습니다.

6

당신은 async void을 피해야한다. LoadConfigSave 메서드를 async Task 메서드로 변경하고 호출 코드 await을 반환해야합니다.

async void의 한 가지 문제점은 완료시 을 알 수 없다는 것입니다. 예를 들어, LoadConfig을 호출하는 코드는 config가 실제로로드되는시기를 알 수 없습니다. LoadConfigTask으로 만들면 호출 코드는 await이되고 Task이되고 작업 완료시 config가로드되었음을 알 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 저는 비동기 및 작업을 제안했으나 동작을 변경하지 않았습니다. 어디 exacty 저장 설정 절차를 호출하는 가장 좋은 장소는 무엇입니까? App.xaml.cs의 "OnSuspending"이벤트에서? – Hugo