![](/img/trans.png)
[英]UI Thread freezing up when adding Items to ObservableCollection
[英]UI freezing when altering ObservableCollection/CollectionViewSource
我有一個數據網格正在接收100,000+行的更新,該行綁定到源為ObservableCollection的CollectionViewSource.View。 如果我嘗試在當前設置中進行更新,則在將新行添加到ObservableCollection時,UI會完全凍結。 要解決此問題,我在將行添加到ObservableCollection之前將CollectionViewSource.Source = null設置為允許其正常工作。 唯一的問題是,一旦我對第一個加載執行此操作,則下一個加載仍將存在UI凍結問題。 這是代碼。
public CollectionViewSource ViewSource { get; set; }
private ObservableCollection<ScreenerRow> internalRows = new ObservableCollection<ScreenerRow>();
private async Task Search()
{
internalRows.Clear();
ViewSource.Source = null;
var data = await Task.Run(() =>
{
return DoStuff();
});
if (data == null) return;
foreach (ScreenerRow sRow in data)
{
//freezes in here on second run
internalRows.Add(sRow);
}
ViewSource.Source = internalRows;
}
只是想知道是否有人遇到過這個問題,或者我的操作方式是否有問題。 謝謝您的幫助。
編輯:將我的ObservableCollection更改為列表,可以使其正常工作。
//private ObservableCollection<ScreenerRow> internalRows = new ObservableCollection<ScreenerRow>();
private List<ScreenerRow> internalRows = new List<ScreenerRow>();
我從您的編輯中得出可能不是這種情況,但是如果確實需要實際觀察集合,則還可以使用CollectionViewSource.DeferRefresh()
方法來防止每次更新UI后個人變更:
private async Task Search()
{
internalRows.Clear();
using(ViewSource.DeferRefresh())
{
var data = await Task.Run(() => GetSearchResults());
if (data == null) return;
foreach (ScreenerRow sRow in data)
{
internalRows.Add(sRow);
}
}
}
還要確保在控件上正確設置了虛擬化模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.