DataContractJsonSerializer 在 UI 线程以外的任何线程上失败
DataContractJsonSerializer fails on any thread other than UI thread
在我的 WPF 应用程序中,我有 class 序列化和反序列化给定对象到 JSON。如果我从 UI 线程调用反序列化方法,它工作正常。但是我希望它在后台工作,每当它在另一个线程上时,我都会收到 "Exception has been thrown by the target of an invocation" 错误。
这是反序列化方法
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(class 被反序列化)实现了 INotifyPropertyChanged 接口并具有以下方法
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
当对象被反序列化时正在调用它(哎呀),将其注释掉暂时解决了这个问题。
在我的 WPF 应用程序中,我有 class 序列化和反序列化给定对象到 JSON。如果我从 UI 线程调用反序列化方法,它工作正常。但是我希望它在后台工作,每当它在另一个线程上时,我都会收到 "Exception has been thrown by the target of an invocation" 错误。
这是反序列化方法
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(class 被反序列化)实现了 INotifyPropertyChanged 接口并具有以下方法
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
当对象被反序列化时正在调用它(哎呀),将其注释掉暂时解决了这个问题。