Catelを使用して WPF アプリケーションを実装しています。
拡張するクラスがObservableCollection
あり、アイテムが挿入されるたびに UI を更新する必要があります。
コード(簡易版):
public abstract class LogCollections : ObservableCollection<Log4NetLog> {
private readonly Object _locker;
protected LogCollections() {
_logChart = new LoggingLevelChart();
_locker = new object();
}
public object Locker {
get { return _locker; }
protected override void InsertItem(int index, Log4NetLog item) {
lock (_locker) {
base.InsertItem(index, item);
if (item == null) {
return;
}
Log4NetLog temp = item as Log4NetLog;
// Updating
if (temp != null) {
// Updating
}
} //UnLock
}
}
}
今まで、.NET 4.5 でのみ使用できるBindingOperations.EnableCollectionSynchronizationを使用してきました。残念ながら、.Net 4 を使用してコードをコンパイルする必要があります。
私は知りたいのですが、この種の問題を解決する Catel フレームワークには何かありますか?
より詳しい情報:
このアプリケーションの場合 コレクションに多くの項目を追加するので、パフォーマンスが主な問題です。
アップデート:
を使用FastObservableCollection
すると問題は解決しますが、使用をやめるとすぐに UI が約 5 ~ 7 秒間フリーズします。私の推測では、これはDispatcher
私は手動でオーバーライドしましたOnCollectionChanged
:
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) {
DispatcherHelper.CurrentDispatcher.BeginInvoke(new Action(() => base.OnCollectionChanged(e)),
DispatcherPriority.ContextIdle);
}
これは良い解決策ではありません。この問題を回避するより良い方法はありますか?