Language

BindingOperations.EnableCollectionSynchronization メソッド

定義

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

オーバーロード

名前 説明
EnableCollectionSynchronization(IEnumerable, Object)

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

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

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

注釈

WPF アプリケーションでは、ItemsControl またはそのサブクラス (ListBox、DataGrid、TreeView、ListView など) を使用してデータのコレクションを表示できます。 WPFCollectionView のサブクラスを介して、コレクションへのすべてのアクセスをチャネルします。 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 アプリケーションでは、ItemsControl またはそのサブクラス (ListBox、DataGrid、TreeView、ListView など) を使用してデータのコレクションを表示できます。 WPFCollectionView のサブクラスを介して、コレクションへのすべてのアクセスをチャネルします。 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 アプリケーションでは、ItemsControl またはそのサブクラス (ListBox、DataGrid、TreeView、ListView など) を使用してデータのコレクションを表示できます。 WPFCollectionView のサブクラスを介して、コレクションへのすべてのアクセスをチャネルします。 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できます。

適用対象