Share via


BindingOperations.EnableCollectionSynchronization 方法

定义

使 CollectionView 对象能够参与对多个线程上使用的集合的同步访问。

重载

EnableCollectionSynchronization(IEnumerable, Object)

通过使用简单的锁定机制,使 CollectionView 对象能够参与对多个线程上使用的集合的同步访问。

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

通过使用机制而不是简单的锁定,使 CollectionView 对象能够参与对多个线程上使用的集合的同步访问。

注解

WPF 应用程序可以使用 或其子类之一 (ListBox、、DataGridTreeViewListView等) 来显示数据的ItemsControl集合。 WPF 通过 的子类 CollectionView来通道其对集合的所有访问。 ItemsControlCollectionView 都与创建 的线程ItemsControl关联,这意味着禁止在不同的线程上使用它们,并引发异常。 实际上,此限制也适用于集合。

你可能想要在多个线程上使用 集合。   例如,你想要更新集合 (添加或删除在“数据收集”线程上) 项,同时在“用户界面”线程上显示结果,以便在进行数据收集时 UI 保持响应。 在这种情况下,你负责确保同步 (“线程安全”) 对集合的访问。   这通常使用简单的锁定机制或更复杂的同步机制(如信号灯、重置事件等)来完成。

虽然必须同步应用程序对集合的访问,但还必须保证从 WPF (专门访问 CollectionView) 参与同一同步机制。  为此,可调用 EnableCollectionSynchronization 方法。

若要在多个线程(其中一个线程是拥有 的 ItemsControlUI 线程)上使用集合,应用程序具有以下职责:

  1. 选择同步机制。

  2. 使用该机制将应用程序中的所有访问同步到集合。

  3. 调用 EnableCollectionSynchronization 以通知 WPF 机制。

  4. 确保对集合的更改以及通过 INotifyCollectionChanged) (该更改的通知是原子的;来自其他线程的访问无法干预。  (这通常是免费的。例如, ObservableCollection<T> 保证这一点,前提是所有更改都受 synchronization 保护。)

  5. 如果调用 DisableCollectionSynchronization,该调用也必须在 UI 线程上发生。

  6. 如果要在多个 UI 线程上使用同一集合,则必须根据需要在每个 UI 线程上单独调用 EnableCollectionSynchronization (和 DisableCollectionSynchronization) 。

  7. 避免死锁。  一旦应用程序选择使用同步,这已经是应用程序的责任,但它还必须考虑到 WPF 参与同步,如下一段中所述。

返回时,WPF 提供以下行为:

  • 使用 CollectionView 给定的同步机制访问集合。

  • 维护 CollectionView 集合的“卷影副本”,以便在 UI 线程上使用。

  • CollectionChanged 事件在到达任何线程) (时排队。

  • 当 UI 线程有机会这样做时,挂起事件将异步应用于 UI 线程上的卷影复制。

  • CollectionView不会直接使用应用程序可见的任何其他同步机制。 这是 WPF 帮助避免死锁的方法, (看到上一项 7) 。  

其净效果是,你可以更改任何线程上的集合,当 UI 线程有时间“赶上”时,这些更改最终会显示在 ItemsControl 中。  该实现已优化,以限制流向 UI 线程的更改速率,防止后台线程饱和 UI 线程并耗尽对正常用户输入的响应。

EnableCollectionSynchronization(IEnumerable, Object)

通过使用简单的锁定机制,使 CollectionView 对象能够参与对多个线程上使用的集合的同步访问。

public:
 static void EnableCollectionSynchronization(System::Collections::IEnumerable ^ collection, System::Object ^ lockObject);
public static void EnableCollectionSynchronization (System.Collections.IEnumerable collection, object lockObject);
static member EnableCollectionSynchronization : System.Collections.IEnumerable * obj -> unit
Public Shared Sub EnableCollectionSynchronization (collection As IEnumerable, lockObject As Object)

参数

collection
IEnumerable

需同步访问的集合。

lockObject
Object

访问集合时要锁定的对象。

注解

WPF 应用程序可以使用 或其子类之一 (ListBox、、DataGridTreeViewListView等) 来显示数据的ItemsControl集合。 WPF 通过 的子类 CollectionView来通道其对集合的所有访问。 ItemsControlCollectionView 都与创建 的线程ItemsControl关联,这意味着禁止在不同的线程上使用它们,并引发异常。 实际上,此限制也适用于集合。

你可能想要在多个线程上使用 集合。   例如,你想要更新集合 (添加或删除在“数据收集”线程上) 项,同时在“用户界面”线程上显示结果,以便在进行数据收集时 UI 保持响应。 在这种情况下,你负责确保同步 (“线程安全”) 对集合的访问,并保证来自 WPF (特别是来自 CollectionView) 的访问参与相同的同步机制。 通过调用 EnableCollectionSynchronization(IEnumerable, Object) 方法,可以使用简单的锁定机制执行此操作。

若要在多个线程(其中一个线程是拥有 的 ItemsControlUI 线程)上使用集合,必须执行以下操作:

  1. 在访问集合时实例化要锁定的对象。

  2. 通过锁定该对象,将应用程序的所有访问同步到集合。

  3. 调用 EnableCollectionSynchronization(IEnumerable, Object) 以通知 WPF 你正在使用简单的锁定机制。

    • 调用必须在 UI 线程上发生。

    • 调用必须在其他线程上使用集合之前或将集合 ItemsControl附加到 之前发生,以较晚者为准。

  4. 确保对集合的更改以及通过 INotifyCollectionChanged) (更改的通知是原子的;来自其他线程的访问都无法干预。  (这通常是免费的。例如, ObservableCollection<T> 保证这一点,前提是所有更改都受 synchronization.)

  5. 如果调用 DisableCollectionSynchronization,该调用也必须在 UI 线程上发生。

  6. 如果要在多个 UI 线程上使用相同的集合,则必须调用 (和 DisableCollectionSynchronization,如果需要,) 在每个 UI 线程上单独调用 EnableCollectionSynchronization

  7. 避免死锁。  一旦应用程序选择使用同步,这已是应用程序的责任,但它还必须考虑到 WPF 参与同步。  (有关详细信息,请参阅下文。)

结果,WPF 提供以下行为:

  • 使用 CollectionView 锁定机制访问集合。

  • 维护 CollectionView 集合的“卷影副本”,以便在 UI 线程上使用。

  • CollectionChanged 事件在到达任何线程) (时排队。

  • 当 UI 线程有机会执行此操作时,挂起的事件将异步应用于 UI 线程上的卷影副本。

  • CollectionView不会直接使用应用程序可见的任何其他同步机制。 这是 WPF 帮助避免死锁的方法, (请参阅上一项 7) 。  

其净效果是,你可以在任何线程上更改集合,当 UI 线程有时间“赶上”时,这些更改最终会显示在 中 ItemsControl 。  该实现已经过优化,以限制流向 UI 线程的更改速率,防止后台线程饱和 UI 线程并耗尽对正常用户输入的响应。

适用于

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

通过使用机制而不是简单的锁定,使 CollectionView 对象能够参与对多个线程上使用的集合的同步访问。

public:
 static void EnableCollectionSynchronization(System::Collections::IEnumerable ^ collection, System::Object ^ context, System::Windows::Data::CollectionSynchronizationCallback ^ synchronizationCallback);
public static void EnableCollectionSynchronization (System.Collections.IEnumerable collection, object context, System.Windows.Data.CollectionSynchronizationCallback synchronizationCallback);
static member EnableCollectionSynchronization : System.Collections.IEnumerable * obj * System.Windows.Data.CollectionSynchronizationCallback -> unit
Public Shared Sub EnableCollectionSynchronization (collection As IEnumerable, context As Object, synchronizationCallback As CollectionSynchronizationCallback)

参数

collection
IEnumerable

需同步访问的集合。

context
Object

传递给回调的对象。

synchronizationCallback
CollectionSynchronizationCallback

每当需要访问集合时,就会调用的回调。 可用于确保集合一次被一个线程访问。

注解

WPF 应用程序可以使用 或其子类之一 (ListBox、、DataGridTreeViewListView等) 来显示数据的ItemsControl集合。 WPF 通过 的子类 CollectionView来通道其对集合的所有访问。 ItemsControlCollectionView 都与创建 的线程ItemsControl关联,这意味着禁止在不同的线程上使用它们,并引发异常。 实际上,此限制也适用于集合。

你可能想要在多个线程上使用 集合。   例如,你想要更新集合 (添加或删除在“数据收集”线程上) 项,同时在“用户界面”线程上显示结果,以便在进行数据收集时 UI 保持响应。 在这种情况下,你负责确保同步 (“线程安全”) 对集合的访问,并保证来自 WPF (特别是来自 CollectionView) 的访问参与相同的同步机制。 通过调用 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 方法,可以使用信号灯、重置事件等同步机制执行此操作。

若要在多个线程(其中一个线程是拥有 的 ItemsControlUI 线程)上使用集合,必须执行以下操作:

  1. 选择同步机制。

  2. 使用该机制将应用程序中的所有访问同步到集合。

  3. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)调用 重载以通知 WPF 你使用的是非简单锁定机制。

    • 调用必须在 UI 线程上发生。

    • 调用必须在其他线程上使用集合之前或将集合 ItemsControl附加到 之前发生,以较晚者为准。

  4. 确保对集合的更改以及通过 INotifyCollectionChanged) (更改的通知是原子的;来自其他线程的访问都无法干预。  (这通常是免费的。例如, ObservableCollection<T> 保证这一点,前提是所有更改都受 synchronization.)

  5. 如果调用 DisableCollectionSynchronization,该调用也必须在 UI 线程上发生。

  6. 如果要在多个 UI 线程上使用相同的集合,则必须调用 (和 DisableCollectionSynchronization,如果需要,) 在每个 UI 线程上单独调用 EnableCollectionSynchronization

  7. 避免死锁。  一旦应用程序选择使用同步,这已是应用程序的责任,但它还必须考虑到 WPF 参与同步。  (有关详细信息,请参阅下文。)

结果,WPF 提供以下行为:

  • CollectionView通过调用使用以下参数注册CollectionSynchronizationCallback的 来访问集合:

    • collection:感兴趣的集合。
    • context:已注册的上下文对象。
    • accessMethod:执行实际访问的委托。
    • writeAccesstrue 如果委托将修改集合,则为 ; false 否则为 。

    CollectionSynchronizationCallback 使用 context 对象和 writeAccess 值在集合 (上建立同步,) 调用 accessMethod,然后释放同步。

  • 维护 CollectionView 集合的“卷影副本”,以便在 UI 线程上使用。

  • CollectionChanged 事件在到达任何线程) (时排队。

  • 当 UI 线程有机会执行此操作时,挂起的事件将异步应用于 UI 线程上的卷影副本。

  • CollectionView不会直接使用应用程序可见的任何其他同步机制。 这是 WPF 帮助避免死锁的方法, (请参阅上一项 7) 。  

其净效果是,你可以在任何线程上更改集合,当 UI 线程有时间“赶上”时,这些更改最终会显示在 中 ItemsControl 。  该实现已经过优化,以限制流向 UI 线程的更改速率,防止后台线程饱和 UI 线程并耗尽对正常用户输入的响应。

参数 context 是传递给 的 callback任意对象。 可以使用它来确定用于控制对 的访问的 collection同步机制。 Context 可以是 null

适用于