C# 螺纹安全、列表、装订和WPF
我有一个绑定到集合(C# 螺纹安全、列表、装订和WPF,c#,wpf,multithreading,data-binding,concurrency,C#,Wpf,Multithreading,Data Binding,Concurrency,我有一个绑定到集合(List)的WPF ListView。它当前从工作正常的当前线程更新 我想将更新列表的逻辑移动到一个线程中,我看到了一些关于线程安全和列表绑定的潜在问题。我可以保证绑定不会被更新,除非我调用NotifyPropertyChanged?NotifyPropertyChanged是阻塞调用还是只是将其添加到消息队列中;在这种情况下,我可能会告诉ListView集合已更新,但在绑定更新时,我可能正在另一个线程中修改集合,这将引发异常或程序崩溃 在这种情况下,实现线程安全的最佳方法是
List
)的WPF ListView。它当前从工作正常的当前线程更新
我想将更新列表的逻辑移动到一个线程中,我看到了一些关于线程安全和列表绑定的潜在问题。我可以保证绑定不会被更新,除非我调用NotifyPropertyChanged
?NotifyPropertyChanged
是阻塞调用还是只是将其添加到消息队列中;在这种情况下,我可能会告诉ListView
集合已更新,但在绑定更新时,我可能正在另一个线程中修改集合,这将引发异常或程序崩溃
在这种情况下,实现线程安全的最佳方法是什么?您可以从Dispatcher更新集合。调用以避免这些线程问题:
void ThreadProc()
{
window.Dispatcher.Invoke(() => {
//UpdateList
});
}
INotifyPropertyChanged不是线程安全的,它会阻止调用线程 最好的?这是个好问题。我不知道。底线是,在某些时候,调用必须被编组到UI线程上。你什么时候做这个 您可以1)准备好所有内容,然后将其交付到UI线程,然后更新UI。或者,您可以2)实现INotifyPropertyChanged并使该事件始终在UI线程上触发,或者3)您可以执行多种不同的操作之一 但是,通常情况下,您希望UI的更新一次完成(而不是一次更新一个,例如,将单个项添加到ObservableCollection时)。因此,建议更改并使用一些实现INotifyProperty和CollectionChanged的线程安全基类
不幸的是,框架中没有任何东西可以为您做到这一点。Invoke不是阻塞调用,是吗?当然,可以在修改列表的同时更新绑定。@Chris它是同步的,但您始终可以调用Begin/EndInvoke。