在WPF中填充集合时如何避免冻结UI线程

时间:2019-07-18 16:09:01

标签: c# wpf

我正在使用WPF和.NET Framework 4.6.1,并且遇到性能问题。我现在正在执行大多数繁重的任务,这些任务可能会阻止UI线程异步。 但是我遇到一个问题,就是我要反序列化具有400000个对象的txt文件。 txt文件的大小约为270mb。反序列化的速度非常快,并分配this.Data和反序列化的数据不会冻结线程。但是问题是,当我创建绑定到Gridview的DataCollection时,UI开始冻结,然后可以正常工作。

我试图在下面创建两个实例的空实例,然后将deserializedData拆分为块,同时在this.data中添加/ addrange,但过程非常缓慢,最后,它仍然冻结了UI线程一点点。 Alternive 2可以快速填充集合,但是会冻结UI线程瞬间,直到完成重新绘制网格为止。尽管替代方法1直到添加了所有项目,才会冻结UI线程。

好吧,如果我要用替代方法1进行foreach循环,那么如果要快速循环,您会说要花多少时间?

我该如何解决?

 // Alternative 1
 this.Data = new ObservableCollection<ContractMetaData>();
 this.DataCollection = new QueryableCollectionView(ActiveContractData);
 var deserializedData = GetDeserializedData(path);

 foreach(var item in DeserializedData)
       this.Data.Add(item);


 // Alternative 2
 this.Data = new ObservableCollection<ContractMetaData>(GetDeserializedData(path););
 this.DataCollection = new QueryableCollectionView(ActiveContractData);

1 个答案:

答案 0 :(得分:-3)

您必须使用支持数据虚拟化的控件,看看其中的同步融合

https://help.syncfusion.com/wpf/datagrid/data-virtualization