繁体   English   中英

DataContractJsonSerializer在除UI线程之外的任何其他线程上失败

[英]DataContractJsonSerializer fails on any thread other than UI thread

在我的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线程上运行此选项,因此,非常感谢获得解决此问题的任何帮助。

我发现了问题。 由于与问题中的代码无关,因此有问题的代码如下:

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

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

当对象反序列化(哎呀)时被调用,注释掉它暂时解决了这个问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM