BindingOperations.EnableCollectionSynchronization メソッド

定義

CollectionView オブジェクトが、複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。Enables a CollectionView object to participate in synchronized access to a collection that is used on multiple threads.

オーバーロード

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView オブジェクトが、単純なロック メカニズムを使用して複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。Enables a CollectionView object to participate in synchronized access to a collection used on multiple threads by using a simple locking mechanism.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

CollectionView オブジェクトが、単純なロック以外のメカニズムを使用して複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。Enables a CollectionView object to participate in synchronized access to a collection used on multiple threads by using a mechanism other than a simple lock.

注釈

WPF アプリケーションでは、ItemsControl またはそのサブクラス (ListBoxDataGridTreeViewListViewなど) のいずれかを使用して、データのコレクションを表示できます。A WPF application can display a collection of data using an ItemsControl or one of its subclasses (ListBox, DataGrid, TreeView, ListView, etc.). WPF チャネルは、CollectionViewのサブクラスを使用して、コレクションへのすべてのアクセスを行います。 WPF channels all its access to the collection through a subclass of CollectionView. ItemsControlCollectionView はどちらも、ItemsControl が作成されたスレッドに関係があります。つまり、別のスレッドで使用することは禁止され、例外がスローされます。 Both the ItemsControl and the CollectionView have affinity to the thread on which the ItemsControl was created, meaning that using them on a different thread is forbidden and throws an exception. 実際には、この制限はコレクションにも適用されます。 In effect, this restriction applies to the collection as well.   複数のスレッドでコレクションを使用することもできます。You may want to use the collection on multiple threads.   たとえば、"ユーザーインターフェイス" スレッドに対して結果を表示しながら、"データ収集" スレッドでコレクション (項目の追加または削除) を更新し、データ収集が行われている間は UI の応答性を維持する必要があるとします。   For example, you want to update the collection (add or remove items) on a "data-gathering" thread, while displaying the results on a "user interface" thread, so that the UI remains responsive while data-gathering is happening. このような状況では、コレクションへの同期された ("スレッドセーフ" の) アクセスを保証する責任があります。 In such a situation, you are responsible for ensuring synchronized ("thread-safe") access to the collection.   これは通常、単純なロックメカニズム、またはセマフォや reset イベントなどのより複雑な同期機構を使用して行われ   ます。アプリケーションのアクセスをコレクションに同期する必要がある間に、WPF からのアクセス (具体的には CollectionView) が同じ同期メカニズムに参加することを保証する必要もあります。   This is typically done using either a simple lock mechanism or a more elaborate synchronization mechanism such as semaphores, reset events, etc.   While you must synchronize your application's access to the collection, you must also guarantee that access from WPF (specifically from CollectionView) participates in the same synchronization mechanism.  これを行うには、EnableCollectionSynchronization メソッドを呼び出します。  You do this by calling the EnableCollectionSynchronization method.   ItemsControlを所有する UI スレッドである複数のスレッドでコレクションを使用するには、アプリケーションに次の役割があります。To use a collection on multiple threads, one of which is the UI thread that owns the ItemsControl, an application has the following responsibilities:

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

  2. そのメカニズムを使用して、アプリケーションからコレクションへのすべてのアクセスを同期します。Synchronize all access from the application to the collection using that mechanism.

  3. EnableCollectionSynchronization を呼び出して、機構を WPF に通知します。Call EnableCollectionSynchronization to inform WPF of the mechanism.

  4. コレクションへの変更とその変更の通知 (INotifyCollectionChanged) がアトミックであることを確認します。他のスレッドからのアクセスを介入することはできません。Ensure that a change to the collection and the notification of that change (through INotifyCollectionChanged) are atomic; no access from other threads can intervene.  (通常は無料です。  (This is usually free. たとえば、すべての変更が同期によって保護されている場合、ObservableCollection<T> はこれを保証します。)For instance, ObservableCollection<T> guarantees this, provided that all changes are protected by synchronization.)

  5.  DisableCollectionSynchronizationを呼び出す場合、その呼び出しは UI スレッドでも発生する必要があります。If you call DisableCollectionSynchronization, that call must also occur on the UI thread.

  6. 複数の UI スレッドで同じコレクションを使用する場合は、各 UI スレッドで個別に EnableCollectionSynchronization (および必要に応じて DisableCollectionSynchronization) を呼び出す必要があります。If you want to use the same collection on multiple UI threads, you must call EnableCollectionSynchronization (and DisableCollectionSynchronization, if needed) separately on each UI thread.

  7. デッドロックを回避します。Avoid deadlock.  同期を使用することを選択した場合、これは既にアプリケーションの役割ですが、次の段落で説明されているように、WPF の同期への参加も考慮する必要があります。  This is already the application's responsibility once it chooses to use synchronization, but it must also take into account WPF's participation in the synchronization, as discussed in the following paragraph.

その結果、WPF は次の動作を提供します。In return, WPF provides the following behavior:

  • CollectionView は、指定された同期機構を使用してコレクションにアクセスします。The CollectionView accesses the collection using the given synchronization mechanism.

  • CollectionView は、UI スレッドで使用するコレクションの "シャドウコピー" を保持します。The CollectionView maintains a "shadow copy" of the collection for use on the UI thread.

  • CollectionChanged イベントは、受信時にキューに登録されます (任意のスレッド)。CollectionChanged events are queued up as they arrive (on any thread).

  • 保留中のイベントは、そのような場合に、UI スレッドで非同期にシャドウコピーに適用されます。Pending events are applied to the shadow copy asynchronously on the UI thread when it has the opportunity to do so.

  • CollectionView は、アプリケーションに表示される他の同期機構を直接使用しません。The CollectionView won't directly use any other synchronization mechanism visible to the application. これは、デッドロックを回避する WPF の方法です (前の項目7を参照)。This is WPF's way of helping to avoid deadlock (see the previous item 7).  

実質的には、任意のスレッドでコレクションを変更することができ、UI スレッドの "キャッチアップ" の時間が経過すると、これらの変更が最終的に ItemsControl に表示されます。The net effect is that you can change the collection on any thread, and those changes eventually appear in the ItemsControl when the UI thread has time to "catch up".  実装は、バックグラウンドスレッドによる UI スレッドの飽和状態を維持し、通常のユーザー入力への応答を確保するために、UI スレッドに変更が流れる速度を調整するように調整されています。  The implementation has been tuned to throttle the rate that changes flow into the UI thread to keep background threads from saturating the UI thread and starving the response to normal user input.

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView オブジェクトが、単純なロック メカニズムを使用して複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。Enables a CollectionView object to participate in synchronized access to a collection used on multiple threads by using a simple locking mechanism.

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

同期アクセスが必要なコレクション。The collection that needs synchronized access.

lockObject
Object

コレクションにアクセスするときにロックするオブジェクト。The object to lock when accessing the collection.

注釈

WPF アプリケーションでは、ItemsControl またはそのサブクラス (ListBoxDataGridTreeViewListViewなど) のいずれかを使用して、データのコレクションを表示できます。A WPF application can display a collection of data using an ItemsControl or one of its subclasses (ListBox, DataGrid, TreeView, ListView, etc.). WPF チャネルは、CollectionViewのサブクラスを使用して、コレクションへのすべてのアクセスを行います。 WPF channels all its access to the collection through a subclass of CollectionView. ItemsControlCollectionView はどちらも、ItemsControl が作成されたスレッドに関係があります。つまり、別のスレッドで使用することは禁止され、例外がスローされます。 Both the ItemsControl and the CollectionView have affinity to the thread on which the ItemsControl was created, meaning that using them on a different thread is forbidden and throws an exception. 実際には、この制限はコレクションにも適用されます。 In effect, this restriction applies to the collection as well.   複数のスレッドでコレクションを使用することもできます。You may want to use the collection on multiple threads.   たとえば、"ユーザーインターフェイス" スレッドに対して結果を表示しながら、"データ収集" スレッドでコレクション (項目の追加または削除) を更新し、データ収集が行われている間は UI の応答性を維持する必要があるとします。   For example, you want to update the collection (add or remove items) on a "data-gathering" thread, while displaying the results on a "user interface" thread, so that the UI remains responsive while data-gathering is happening. このような状況では、コレクションへの同期された ("スレッドセーフな") アクセスを保証すると共に、(具体的には CollectionViewからの) WPF からのアクセスが同じ同期機構に参加することを保証します。 In such a situation, you are responsible for ensuring synchronized ("thread-safe") access to the collection and for guaranteeing that access from WPF (specifically from CollectionView) participates in the same synchronization mechanism. EnableCollectionSynchronization(IEnumerable, Object) メソッドを呼び出すことにより、単純なロックメカニズムを使用してこれを行うことができます。 By calling the EnableCollectionSynchronization(IEnumerable, Object) method, you can do this by using a simple lock mechanism.   ItemsControlを所有する UI スレッドである複数のスレッドでコレクションを使用するには、次の操作を行う必要があります。To use a collection on multiple threads, one of which is the UI thread that owns the ItemsControl, you must do the following:

  1. コレクションにアクセスするときにロックするオブジェクトをインスタンス化します。Instantiate an object to lock when accessing the collection.

  2. オブジェクトをロックして、アプリケーションからコレクションへのすべてのアクセスを同期します。Synchronize all access from the application to the collection by locking that object.

  3. EnableCollectionSynchronization(IEnumerable, Object) を呼び出して、単純なロックメカニズムを使用していることを WPF に知らせます。Call EnableCollectionSynchronization(IEnumerable, Object) to inform WPF that you are using a simple lock mechanism.

    • この呼び出しは、UI スレッドで実行する必要があります。The call must occur on the UI thread.

    • この呼び出しは、別のスレッドでコレクションを使用する前、またはコレクションを ItemsControlにアタッチする前に行う必要があります (どちらか早い方)。The call must occur before using the collection on a different thread or before attaching the collection to the ItemsControl, whichever is later.

  4. コレクションへの変更とその変更の通知 (INotifyCollectionChanged) がアトミックであることを確認します。他のスレッドからのアクセスを介入することはできません。Ensure that a change to the collection and the notification of that change (through INotifyCollectionChanged) are atomic; no access from other threads can intervene.  (通常は無料です。  (This is usually free. たとえば、すべての変更が同期によって保護されている場合、ObservableCollection<T> はこれを保証します。)For instance, ObservableCollection<T> guarantees this, provided that all changes are protected by synchronization.)

  5.  DisableCollectionSynchronizationを呼び出す場合、その呼び出しは UI スレッドでも発生する必要があります。If you call DisableCollectionSynchronization, that call must also occur on the UI thread.

  6. 複数の UI スレッドで同じコレクションを使用する場合は、各 UI スレッドで個別に EnableCollectionSynchronization (および必要に応じて DisableCollectionSynchronization) を呼び出す必要があります。If you want to use the same collection on multiple UI threads, you must call EnableCollectionSynchronization (and DisableCollectionSynchronization, if needed) separately on each UI thread.

  7. デッドロックを回避します。Avoid deadlock.  同期を使用することを選択した場合、これは既にアプリケーションの役割ですが、その場合も WPF の同期への参加を考慮する必要があります。  This is already the application's responsibility once it chooses to use synchronization, but it must also take into account WPF's participation in the synchronization. (詳細については、以下を参照してください。) (See more, below.)

その結果、WPF は次の動作を提供します。In return, WPF provides the following behavior:

  • CollectionView は、ロック機構を使用してコレクションにアクセスします。The CollectionView accesses the collection using the locking mechanism.

  • CollectionView は、UI スレッドで使用するコレクションの "シャドウコピー" を保持します。The CollectionView maintains a "shadow copy" of the collection for use on the UI thread.

  • CollectionChanged イベントは、受信時にキューに登録されます (任意のスレッド)。CollectionChanged events are queued up as they arrive (on any thread).

  • 保留中のイベントは、そのような場合に、UI スレッドで非同期にシャドウコピーに適用されます。Pending events are applied to the shadow copy asynchronously on the UI thread when it has the opportunity to do so.

  • CollectionView は、アプリケーションに表示される他の同期機構を直接使用しません。The CollectionView will not directly use any other synchronization mechanism visible to the application. これは、デッドロックを回避する WPF の方法です (前の項目7を参照)。This is WPF's way of helping to avoid deadlock (see the previous item 7).  

実質的には、任意のスレッドでコレクションを変更することができ、UI スレッドの "キャッチアップ" の時間が経過すると、これらの変更が最終的に ItemsControl に表示されます。The net effect is that you can change the collection on any thread, and those changes eventually appear in the ItemsControl when the UI thread has time to "catch up".  実装は、バックグラウンドスレッドによる UI スレッドの飽和状態を維持し、通常のユーザー入力への応答を確保するために、UI スレッドに変更が流れる速度を調整するように調整されています。  The implementation has been tuned to throttle the rate that changes flow into the UI thread to keep background threads from saturating the UI thread and starving the response to normal user input.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

CollectionView オブジェクトが、単純なロック以外のメカニズムを使用して複数のスレッドで使用されるコレクションへの同期アクセスに参加できるようにします。Enables a CollectionView object to participate in synchronized access to a collection used on multiple threads by using a mechanism other than a simple lock.

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

同期アクセスが必要なコレクション。The collection that needs synchronized access.

context
Object

コールバックに渡されるオブジェクト。An object that is passed to the callback.

synchronizationCallback
CollectionSynchronizationCallback

コレクションへのアクセスが必要なときに呼び出されるコールバック。The callback that is invoked whenever access to the collection is required. これを使用して、一度に 1 つのスレッドでコレクションにアクセスできるようにします。You can use it to ensure that the collection is accessed by one thread at a time.

注釈

WPF アプリケーションでは、ItemsControl またはそのサブクラス (ListBoxDataGridTreeViewListViewなど) のいずれかを使用して、データのコレクションを表示できます。A WPF application can display a collection of data using an ItemsControl or one of its subclasses (ListBox, DataGrid, TreeView, ListView, etc.). WPF チャネルは、CollectionViewのサブクラスを使用して、コレクションへのすべてのアクセスを行います。 WPF channels all its access to the collection through a subclass of CollectionView. ItemsControlCollectionView はどちらも、ItemsControl が作成されたスレッドに関係があります。つまり、別のスレッドで使用することは禁止され、例外がスローされます。 Both the ItemsControl and the CollectionView have affinity to the thread on which the ItemsControl was created, meaning that using them on a different thread is forbidden and throws an exception. 実際には、この制限はコレクションにも適用されます。 In effect, this restriction applies to the collection as well.   複数のスレッドでコレクションを使用することもできます。You may want to use the collection on multiple threads.   たとえば、"ユーザーインターフェイス" スレッドに対して結果を表示しながら、"データ収集" スレッドでコレクション (項目の追加または削除) を更新し、データ収集が行われている間は UI の応答性を維持する必要があるとします。   For example, you want to update the collection (add or remove items) on a "data-gathering" thread, while displaying the results on a "user interface" thread, so that the UI remains responsive while data-gathering is happening. このような状況では、コレクションへの同期された ("スレッドセーフな") アクセスを保証すると共に、(具体的には CollectionViewからの) WPF からのアクセスが同じ同期機構に参加することを保証します。 In such a situation, you are responsible for ensuring synchronized ("thread-safe") access to the collection and for guaranteeing that access from WPF (specifically from CollectionView) participates in the same synchronization mechanism. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) メソッドを呼び出すことにより、セマフォ、reset イベントなどの同期機構を使用してこれを行うことができます  。複数のスレッドでコレクションを使用するには、そのうちの1つは ItemsControlを所有する UI スレッドで、次の操作を行う必要があります。By calling the EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) method, you can do this by using a synchronization mechanism such as a semaphores, a reset event, etc.   To use a collection on multiple threads, one of which is the UI thread that owns the ItemsControl, you must do the following:

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

  2. そのメカニズムを使用して、アプリケーションからコレクションへのすべてのアクセスを同期します。Synchronize all access from the application to the collection using that mechanism.

  3. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) のオーバーロードを呼び出して、単純なロック以外のメカニズムを使用していることを WPF に通知します。Call the EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) overload to inform WPF that you are using a mechanism other than simple locking.

    • この呼び出しは、UI スレッドで実行する必要があります。The call must occur on the UI thread.

    • この呼び出しは、別のスレッドでコレクションを使用する前、またはコレクションを ItemsControlにアタッチする前に行う必要があります (どちらか早い方)。The call must occur before using the collection on a different thread or before attaching the collection to the ItemsControl, whichever is later.

  4. コレクションへの変更とその変更の通知 (INotifyCollectionChanged) がアトミックであることを確認します。他のスレッドからのアクセスを介入することはできません。Ensure that a change to the collection and the notification of that change (through INotifyCollectionChanged) are atomic; no access from other threads can intervene.  (通常は無料です。  (This is usually free. たとえば、すべての変更が同期によって保護されている場合、ObservableCollection<T> はこれを保証します。)For instance, ObservableCollection<T> guarantees this, provided that all changes are protected by synchronization.)

  5.  DisableCollectionSynchronizationを呼び出す場合、その呼び出しは UI スレッドでも発生する必要があります。If you call DisableCollectionSynchronization, that call must also occur on the UI thread.

  6. 複数の UI スレッドで同じコレクションを使用する場合は、各 UI スレッドで個別に EnableCollectionSynchronization (および必要に応じて DisableCollectionSynchronization) を呼び出す必要があります。If you want to use the same collection on multiple UI threads, you must call EnableCollectionSynchronization (and DisableCollectionSynchronization, if needed) separately on each UI thread.

  7. デッドロックを回避します。Avoid deadlock.  同期を使用することを選択した場合、これは既にアプリケーションの役割ですが、その場合も WPF の同期への参加を考慮する必要があります。  This is already the application's responsibility once it chooses to use synchronization, but it must also take into account WPF's participation in the synchronization. (詳細については、以下を参照してください。) (See more, below.)

その結果、WPF は次の動作を提供します。In return, WPF provides the following behavior:

  • CollectionView は、次の引数を指定して登録済みの CollectionSynchronizationCallback を呼び出すことによって、コレクションにアクセスします。The CollectionView accesses the collection by calling the registered CollectionSynchronizationCallback with the following arguments:

    • collection: 対象のコレクション。collection: the collection of interest.
    • context: 登録されているコンテキストオブジェクト。context: the registered context object.
    • accessMethod: 実際のアクセスを実行するデリゲート。accessMethod: a delegate that performs the actual access.
    • writeAccess: デリゲートがコレクションを変更するかどうかを true します。それ以外の場合は falsewriteAccess: true if the delegate will modify the collection; false otherwise.

    CollectionSynchronizationCallback は、コレクションに対して同期を確立する必要があります (必要に応じて、context オブジェクトと writeAccess 値を使用します)。次に、accessMethodを呼び出してから、リリース同期を行います。Your CollectionSynchronizationCallback should establish synchronization on the collection (using the context object and the writeAccess value, as appropriate), call the accessMethod, then release synchronization.

  • CollectionView は、UI スレッドで使用するコレクションの "シャドウコピー" を保持します。The CollectionView maintains a "shadow copy" of the collection for use on the UI thread.

  • CollectionChanged イベントは、受信時にキューに登録されます (任意のスレッド)。CollectionChanged events are queued up as they arrive (on any thread).

  • 保留中のイベントは、そのような場合に、UI スレッドで非同期にシャドウコピーに適用されます。Pending events are applied to the shadow copy asynchronously on the UI thread when it has the opportunity to do so.

  • CollectionView は、アプリケーションに表示される他の同期機構を直接使用しません。The CollectionView will not directly use any other synchronization mechanism visible to the application. これは、デッドロックを回避する WPF の方法です (前の項目7を参照)。This is WPF's way of helping to avoid deadlock (see the previous item 7).  

実質的には、任意のスレッドでコレクションを変更することができ、UI スレッドの "キャッチアップ" の時間が経過すると、これらの変更が最終的に ItemsControl に表示されます。The net effect is that you can change the collection on any thread, and those changes eventually appear in the ItemsControl when the UI thread has time to "catch up".  実装は、バックグラウンドスレッドによる UI スレッドの飽和状態を維持し、通常のユーザー入力への応答を確保するために、UI スレッドに変更が流れる速度を調整するように調整されています。  The implementation has been tuned to throttle the rate that changes flow into the UI thread to keep background threads from saturating the UI thread and starving the response to normal user input.

context パラメーターは、callbackに渡される任意のオブジェクトです。The context parameter is an arbitrary object that is passed to the callback. これを使用して、collectionへのアクセスを制御するために使用する同期メカニズムを決定できます。You can use it to determine the synchronization mechanism used to control access to collection. Contextnullできます。Context can be null.

適用対象