Ren*_*821 0 c# multithreading observablecollection maui
我创建了一个 MAUI 应用程序,在视图模型中我有一个ObservableCollection存储位置。然后这些将显示在 UI 上的图表上。但位置的计算需要花费大量时间,因此我在另一个线程上进行计算以保持 UI 畅通。当我计算位置时,我通过调用Application.Current.Dispatcher.Dispatch方法将其添加到新线程上的集合中,如下所示:
Task.Run(() =>
{
for (int i = 0; i < 1000; i++)
{
Application.Current.Dispatcher.Dispatch(() =>
{
myObservableCollection.Add(new Pos() { X = i, Y = i }));
}
}
}
Run Code Online (Sandbox Code Playgroud)
它工作得很好,但我想避免每次迭代中不断的线程切换,所以我想出了这个:
Task.Run(() =>
{
List<Pos> test = new List<Pos>();
for (int i = 0; i < 1000; i++)
{
test.Add(new Pos() { X = i, Y = i }));
}
Application.Current.Dispatcher.Dispatch(() =>
{
myObservableCollection= new ObservableCollection<Pos>(test);
});
}
Run Code Online (Sandbox Code Playgroud)
因此,我创建了列表,并且仅在准备好时才将其传递给可观察集合,以避免线程切换。但这个解决方案根本没有更新用户界面,并且在第一个解决方案完美运行的同时什么也没有出现。为什么第二个不起作用?
因为您的 UI 绑定到一个实例-myObservableCollection每次您创建新实例时,与旧实例的绑定仍然存在并且不会更新。
有几种方法可以解决这个问题。最简单的方法是在您的虚拟机上实现INotifyPropertyChanged并调用PropertyChangedsettermyObservableCollection
或者,您可以使用ObservableRangeCollection允许您一次将多个项目添加到集合中的