BindingOperations.EnableCollectionSynchronization メソッド

定義

CollectionView オブジェクトが、複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。

オーバーロード

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView オブジェクトが、単純なロック メカニズムを使用して複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

CollectionView オブジェクトが、単純なロック以外のメカニズムを使用して複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。

注釈

WPF アプリケーションでは、 またはそのサブクラス (ListBoxDataGridTreeViewListViewなど) のいずれかを使用してItemsControl、データのコレクションを表示できます。 WPF は、 のサブクラス CollectionViewを介してコレクションへのすべてのアクセスをチャネル化します。 ItemsControlと のCollectionView両方に、 が作成されたスレッドItemsControlとのアフィニティがあります。つまり、それらを別のスレッドで使用することは禁止され、例外がスローされます。 実際には、この制限はコレクションにも適用されます。

コレクションを複数のスレッドで使用することもできます。   たとえば、"データ収集" スレッドでコレクションを更新 (項目の追加または削除) し、結果を "ユーザー インターフェイス" スレッドに表示して、データ収集の実行中に UI の応答性を維持する必要があります。 このような状況では、コレクションへの同期 ("スレッド セーフ") アクセスを確保する責任があります。   これは通常、単純なロック メカニズムまたはセマフォ、リセット イベントなどのより複雑な同期メカニズムを使用して行われます。

アプリケーションのコレクションへのアクセスを同期する必要がある一方で、WPF からのアクセス (具体的には から CollectionView) が同じ同期メカニズムに参加することも保証する必要があります。  これを行うには、EnableCollectionSynchronization メソッドを呼び出します。

コレクションを複数のスレッドで使用する場合(そのうちの 1 つは を所有 ItemsControlする UI スレッド)、アプリケーションには次の責任があります。

  1. 同期メカニズムを選択します。

  2. そのメカニズムを使用して、アプリケーションからコレクションへのすべてのアクセスを同期します。

  3. を呼び出 EnableCollectionSynchronization して、WPF にメカニズムを通知します。

  4. コレクションへの変更とその変更の通知 (を通じて INotifyCollectionChanged) がアトミックであることを確認します。他のスレッドからのアクセスは介入できません。  (通常は無料です。たとえば、 ObservableCollection<T> すべての変更が同期によって保護されている場合は、これを保証します)。

  5. を呼び出す DisableCollectionSynchronization場合、その呼び出しは UI スレッドでも発生する必要があります。

  6. 複数の UI スレッドで同じコレクションを使用する場合は、各 UI スレッドで を個別に呼び出す EnableCollectionSynchronization 必要があります (必要 DisableCollectionSynchronizationな場合は 、 )。

  7. デッドロックを回避します。  これは、同期の使用を選択した後にアプリケーションの責任は既にありますが、次の段落で説明するように、WPF の同期への参加も考慮する必要があります。

代わりに、WPF は次の動作を提供します。

  • CollectionView 、指定された同期メカニズムを使用してコレクションにアクセスします。

  • CollectionView 、UI スレッドで使用するためにコレクションの "シャドウ コピー" を保持します。

  • CollectionChanged イベントは、(任意のスレッドで) 到着するとキューに登録されます。

  • 保留中のイベントは、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 アプリケーションでは、 またはそのサブクラス (ListBoxDataGridTreeViewListViewなど) のいずれかを使用してItemsControl、データのコレクションを表示できます。 WPF は、 のサブクラス CollectionViewを介してコレクションへのすべてのアクセスをチャネル化します。 ItemsControlと のCollectionView両方に、 が作成されたスレッドItemsControlとのアフィニティがあります。つまり、それらを別のスレッドで使用することは禁止され、例外がスローされます。 実際には、この制限はコレクションにも適用されます。

コレクションを複数のスレッドで使用することもできます。   たとえば、"データ収集" スレッドでコレクションを更新 (項目の追加または削除) し、結果を "ユーザー インターフェイス" スレッドに表示して、データ収集の実行中に UI の応答性を維持する必要があります。 このような状況では、コレクションへの同期 ("スレッド セーフ") アクセスを確保し、WPF (具体的には CollectionViewから) からのアクセスが同じ同期メカニズムに参加することを保証する責任があります。 メソッドを EnableCollectionSynchronization(IEnumerable, Object) 呼び出すことで、単純なロック メカニズムを使用してこれを行うことができます。

コレクションを複数のスレッドで使用するには、そのうちの 1 つが を所有 ItemsControlする UI スレッドです。次の操作を行う必要があります。

  1. コレクションにアクセスするときにロックするオブジェクトをインスタンス化します。

  2. そのオブジェクトをロックすることで、アプリケーションからコレクションへのすべてのアクセスを同期します。

  3. を呼び出 EnableCollectionSynchronization(IEnumerable, Object) して、単純なロック メカニズムを使用していることを WPF に通知します。

    • 呼び出しは UI スレッドで行う必要があります。

    • 呼び出しは、別のスレッドでコレクションを使用する前、またはコレクションを にアタッチする ItemsControl前のいずれか後に行う必要があります。

  4. コレクションへの変更とその変更の通知 (を通じて INotifyCollectionChanged) がアトミックであることを確認します。他のスレッドからのアクセスは介入できません。  (通常は無料です。たとえば、 ObservableCollection<T> すべての変更が同期によって保護されている場合は、これを保証します)。

  5. を呼び出す DisableCollectionSynchronization場合、その呼び出しは UI スレッドでも発生する必要があります。

  6. 複数の UI スレッドで同じコレクションを使用する場合は、各 UI スレッドで を個別に呼び出す EnableCollectionSynchronization 必要があります (必要 DisableCollectionSynchronizationな場合は 、 )。

  7. デッドロックを回避します。  これは、同期の使用を選択した後でアプリケーションの責任は既にありますが、WPF の同期への参加も考慮する必要があります。 (詳細については、以下を参照してください)。)

代わりに、WPF は次の動作を提供します。

  • CollectionView 、ロック メカニズムを使用してコレクションにアクセスします。

  • CollectionView 、UI スレッドで使用するためにコレクションの "シャドウ コピー" を保持します。

  • CollectionChanged イベントは、(任意のスレッドで) 到着するとキューに登録されます。

  • 保留中のイベントは、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

コレクションへのアクセスが必要なときに呼び出されるコールバック。 これを使用して、一度に 1 つのスレッドでコレクションにアクセスできるようにします。

注釈

WPF アプリケーションでは、 またはそのサブクラス (ListBoxDataGridTreeViewListViewなど) のいずれかを使用してItemsControl、データのコレクションを表示できます。 WPF は、 のサブクラス CollectionViewを介してコレクションへのすべてのアクセスをチャネル化します。 ItemsControlと のCollectionView両方に、 が作成されたスレッドItemsControlとのアフィニティがあります。つまり、それらを別のスレッドで使用することは禁止され、例外がスローされます。 実際には、この制限はコレクションにも適用されます。

コレクションを複数のスレッドで使用することもできます。   たとえば、"データ収集" スレッドでコレクションを更新 (項目の追加または削除) し、結果を "ユーザー インターフェイス" スレッドに表示して、データ収集の実行中に UI の応答性を維持する必要があります。 このような状況では、コレクションへの同期 ("スレッド セーフ") アクセスを確保し、WPF (具体的には CollectionViewから) からのアクセスが同じ同期メカニズムに参加することを保証する責任があります。 メソッドを EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 呼び出すことで、セマフォ、リセット イベントなどの同期メカニズムを使用してこれを行うことができます。

コレクションを複数のスレッドで使用するには、そのうちの 1 つが を所有 ItemsControlする UI スレッドです。次の操作を行う必要があります。

  1. 同期メカニズムを選択します。

  2. そのメカニズムを使用して、アプリケーションからコレクションへのすべてのアクセスを同期します。

  3. オーバーロードを EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 呼び出して、単純なロック以外のメカニズムを使用していることを WPF に通知します。

    • 呼び出しは UI スレッドで行う必要があります。

    • 呼び出しは、別のスレッドでコレクションを使用する前、またはコレクションを にアタッチする ItemsControl前のいずれか後に行う必要があります。

  4. コレクションへの変更とその変更の通知 (を通じて INotifyCollectionChanged) がアトミックであることを確認します。他のスレッドからのアクセスは介入できません。  (通常は無料です。たとえば、 ObservableCollection<T> すべての変更が同期によって保護されている場合は、これを保証します)。

  5. を呼び出す DisableCollectionSynchronization場合、その呼び出しは UI スレッドでも発生する必要があります。

  6. 複数の UI スレッドで同じコレクションを使用する場合は、各 UI スレッドで を個別に呼び出す EnableCollectionSynchronization 必要があります (必要 DisableCollectionSynchronizationな場合は 、 )。

  7. デッドロックを回避します。  これは、同期の使用を選択した後でアプリケーションの責任は既にありますが、WPF の同期への参加も考慮する必要があります。 (詳細については、以下を参照してください)。)

代わりに、WPF は次の動作を提供します。

  • CollectionView 、次の引数で登録されている CollectionSynchronizationCallback を呼び出してコレクションにアクセスします。

    • collection: 関心のあるコレクション。
    • context: 登録済みのコンテキスト オブジェクト。
    • accessMethod: 実際のアクセスを実行するデリゲート。
    • writeAccess: true デリゲートがコレクションを変更する場合は 。 false それ以外の場合は 。

    CollectionSynchronizationCallback(必要に応じて、 オブジェクトと値をcontext使用して) コレクションに同期をwriteAccess確立し、 を呼び出してから同期をaccessMethod解放する必要があります。

  • CollectionView 、UI スレッドで使用するためにコレクションの "シャドウ コピー" を保持します。

  • CollectionChanged イベントは、(任意のスレッドで) 到着するとキューに登録されます。

  • 保留中のイベントは、UI スレッドでシャドウ コピーに非同期的に適用されます。

  • では CollectionView 、アプリケーションに表示される他の同期メカニズムは直接使用されません。 これは、デッドロックを回避するための WPF の方法です (前の項目 7 を参照)。  

最終的な効果は、任意のスレッドでコレクションを変更できることです。これらの変更は、最終的に UI スレッドに "追いつく" 時間があるときに に表示されます ItemsControl 。  バックグラウンド スレッドが UI スレッドを飽和させ、通常のユーザー入力に対する応答を枯渇させないように、変更が UI スレッドに流れ込む速度を調整するように実装が調整されました。

パラメーターは context 、 に渡される任意の callbackオブジェクトです。 これを使用して、 へのアクセスを制御するために使用される同期メカニズムを collection決定できます。 Context には を指定 nullできます。

適用対象