Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 螺纹安全、列表、装订和WPF_C#_Wpf_Multithreading_Data Binding_Concurrency - Fatal编程技术网

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。