在我的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线程上运行它不是一个选项,所以任何帮助解决这个问题都将非常感激。
答案 0 :(得分:0)
我发现了问题。因为它与问题中的代码无关,这里是违规代码:
我的IndexModel(被反序列化的类)实现了INotifyPropertyChanged接口并具有以下方法
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
当对象被反序列化(oops)时正在调用它,现在评论它解决了这个问题。