Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.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 - Fatal编程技术网

C# 如何使对象绑定到WPF控件线程安全

C# 如何使对象绑定到WPF控件线程安全,c#,wpf,multithreading,C#,Wpf,Multithreading,我有一个可观察的集合对象,我正在根据代码更新它的值。此集合双向绑定到数据网格。现在,这个集合是线程安全的吗?也就是说,如果我尝试从代码中修改集合的值,同时用户尝试修改它(作为编辑数据网格的结果),程序会抛出异常吗?如果是,请解释如何避免这种情况 谢谢…这看起来像是重复的,但简单的回答是,如果您正在修改属性,您是安全的 当您使用集合时,如果您试图在多个线程(而不仅仅是UI线程)上修改ObservableCollection,则需要做更多的工作。这已经涵盖了很多内容,您可以在 但是,如果您在UI线程

我有一个可观察的集合对象,我正在根据代码更新它的值。此集合双向绑定到数据网格。现在,这个集合是线程安全的吗?也就是说,如果我尝试从代码中修改集合的值,同时用户尝试修改它(作为编辑数据网格的结果),程序会抛出异常吗?如果是,请解释如何避免这种情况


谢谢…

这看起来像是重复的,但简单的回答是,如果您正在修改属性,您是安全的

当您使用集合时,如果您试图在多个线程(而不仅仅是UI线程)上修改ObservableCollection,则需要做更多的工作。这已经涵盖了很多内容,您可以在


但是,如果您在UI线程中进行修改,您是安全的,因为这是ObservableCollection的目的。只要您通过
Dispatcher.BeginInvoke()

正确封送,事件将在UI线程上创建和处理。我正在使用Dispatcher.BeginInvoke方法更新UI线程中的可观察集合。这就像-当用户编辑数据网格时,可观察集合上会获得一个锁,我使用Dispatcher.BeginInvoke调用的方法将等待它完成?@Manoj当您通过Dispatcher.BeginInvoke将您的工作封送到UI线程时,您很好。当您尝试在不同的线程上更改集合时,确实会出现问题,但我不相信您正在这样做。我希望确认我的理解,但据我所知,这本身不是一个“锁”,而是您正在创建一个NotifyCollectionChanged事件,该事件添加到此类事件的队列中,将由绑定的UI组件读取,并将因此而更新自己的新内容collection@Manoj这让我相信我不是疯子:“修改ObservableCollection时,它会引发一个事件。事件是同步处理的。事件处理程序在与修改相同的线程上响应。处理程序在Add或Remove方法返回之前完成。这意味着你不能在一个后台线程中修改一个ObservableCollection。”这来自页面的四分之三。