2017-03-23 4 views
0

私のWPFアプリケーションでは、JSONとの間で特定のオブジェクトをシリアル化および逆シリアル化するクラスがあります。 UIスレッドからデシリアライズメソッドを呼び出すとうまく動作します。しかし、私はそれがバックグラウンドで動作するようにしたいと思うし、別のスレッド上にあるときはいつでも、「呼び出しのターゲットによって例外がスローされました」というエラーが表示されます。以下UIスレッド以外のスレッドでDataContractJsonSerializerが失敗する

これは、それが.ReadObectで逆シリアル化メソッドUI以外のスレッドで

public T ReadConfig<T>(string name) 
    { 
     InitializeFileSystem(); 
     var ConfigPath = KnownFolders.GetPath(KnownFolder.Documents) + @"\Abc\Config\"; 
     T returnObject = default(T); 
     if (string.IsNullOrEmpty(name)) return default(T); 
     var exists = File.Exists(ConfigPath + name + ".json"); 
     if (!exists) return returnObject; 
     var serializer = new DataContractJsonSerializer(typeof(T)); 
     StreamReader reader = new StreamReader(ConfigPath + name + ".json"); 

     returnObject = (T)serializer.ReadObject(reader.BaseStream); 

     reader.Close(); 
     return returnObject; 
    } 

失敗した(reader.BaseStream)

は、方法は、(App.xaml呼び出される場合それが正常に動作上記のように、私はInitializeModel()の呼び出しをコメントアウトし、代わりに新しいタスクまたは作業項目緩いすべての地獄の休憩を使用している場合が.csファイル)

/// <summary> 
    /// Override Application "Entry Point" 
    /// </summary> 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     InitializeModel(); 
     //Task.Run(() => { InitializeModel(); }); 
     //ThreadPool.QueueUserWorkItem(InitializeModel); 
    } 

    private void InitializeModel(object state = null) 
    { 
     var fileSystem = new FileSystem(); 
     CurrentIndex = fileSystem.ReadConfig<IndexModel>("Index"); 
     CurrentIndex.Start(); 
    } 

、コンパイルされました。

私はテザーの最後にいるので、UIスレッドでこれを実行することはオプションではありません。これを解決する助けがあれば、大歓迎です。

+1

InitializeFileSystemの機能は何ですか? –

+0

例外タイプ、メッセージ、トレースバック、**および内部例外**を含む、例外の完全な 'ToString()'出力は何ですか?メッセージの状態が*例外が呼び出しのターゲットによってスローされたとすれば、 'InnerException'は必要な詳細を持つべきです。可能であれば、メインスレッドとバックグラウンドスレッドは同じファイルへのアクセスのために競合していますか? – dbc

+0

これは、フォルダが存在することを確認し、そうでない場合は作成します(この場合は "Documents¥Abc¥Config¥")。また、既定値でシリアル化されたインデックスオブジェクトを作成し、それをReadConfigメソッドで取得されているIndex.jsonとして保存します。 – Michael

答えて

0

問題が見つかりました。

マイIndexModel(クラスが直列化復元されている)INotifyPropertyChangedインターフェイスを実装し、これが呼び出されていた以下の方法

private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

を持っていた:それは問題のコード無関係だったので、ここに問題のあるコードですオブジェクトがデシリアライズされ(oops)、問題を解決してコメントアウトしました。

関連する問題