DataContractJsonSerializer在UI线程以外的任何线程上失败

时间:2017-03-23 03:03:59

标签: c# .net wpf multithreading datacontractjsonserializer

在我的WPF应用程序中,我有一个类,它将给定对象序列化和反序列化为JSON。如果我从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;
    }

在UI以外的任何线程上,它在.ReadObect(reader.BaseStream)

时失败

以下是调用方法的位置(App.xaml.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();
    }

如上所示进行编译它工作正常,但是如果我注释掉对InitializeModel()的调用,而是使用新的任务或工作项,那么所有地狱都会崩溃。

我在这里结束了,在UI线程上运行它不是一个选项,所以任何帮助解决这个问题都将非常感激。

1 个答案:

答案 0 :(得分:0)

我发现了问题。因为它与问题中的代码无关,这里是违规代码:

我的IndexModel(被反序列化的类)实现了INotifyPropertyChanged接口并具有以下方法

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

当对象被反序列化(oops)时正在调用它,现在评论它解决了这个问题。