[英]Adding controls to flowlayoutpanel from other thread than the UI thread
[英]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.