다음을 통해 공유


BindingOperations.EnableCollectionSynchronization 메서드

정의

여러 스레드에 사용된 컬렉션에 대한 동기화된 액세스에 참여하도록 CollectionView 개체를 활성화합니다.

오버로드

EnableCollectionSynchronization(IEnumerable, Object)

간단한 잠금 메커니즘을 사용하여 여러 스레드에 용된 컬렉션에 대한 동기화된 액세스에 참여하도록 CollectionView 개체를 활성화합니다.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

간단한 잠금 이외의 메커니즘을 사용하여 여러 스레드에 사용된 컬렉션에 대한 동기화된 액세스에 참여하도록 CollectionView 개체를 활성화합니다.

설명

WPF 애플리케이션을 사용 하 여 데이터의 컬렉션을 표시할 수는 ItemsControl 또는 해당 서브 클래스 중 하나 (ListBoxDataGrid, TreeView, ListView등.). WPF는 의 CollectionView하위 클래스를 통해 컬렉션에 대한 모든 액세스를 채널합니다. 및 는 ItemsControlCollectionView 모두 가 만들어진 스레드에 ItemsControl 대한 선호도를 가지며, 이는 다른 스레드에서 사용하는 것이 금지되어 예외를 throw한다는 것을 의미합니다. 실제로 이 제한은 컬렉션에도 적용됩니다.

여러 스레드에서 컬렉션을 사용할 수 있습니다.   예를 들어 데이터 수집이 진행되는 동안 UI가 응답성을 유지하도록 "사용자 인터페이스" 스레드에 결과를 표시하는 동안 "데이터 수집" 스레드에서 컬렉션을 업데이트(항목 추가 또는 제거)할 수 있습니다. 이러한 상황에서는 컬렉션에 대한 동기화된("스레드로부터 안전한") 액세스를 보장해야 합니다.   이 작업은 일반적으로 간단한 잠금 메커니즘 또는 세마포, 다시 설정 이벤트 등과 같은 보다 정교한 동기화 메커니즘을 사용하여 수행됩니다.

컬렉션에 대한 애플리케이션의 액세스를 동기화해야 하지만 WPF(특히 에서 CollectionView)의 액세스가 동일한 동기화 메커니즘에 참여하도록 보장해야 합니다.  이 작업은 EnableCollectionSynchronization 메서드를 호출하여 수행합니다.

여러 스레드에서 컬렉션을 사용 하려면 그 중 하나는 소유 하는 UI 스레드는 ItemsControl, 애플리케이션은 책임은 다음과 같습니다:

  1. 동기화 메커니즘을 선택합니다.

  2. 이 메커니즘을 사용 하 여 컬렉션에 애플리케이션의 모든 액세스를 동기화 합니다.

  3. 를 호출 EnableCollectionSynchronization 하여 WPF에 메커니즘을 알릴 수 있습니다.

  4. 컬렉션의 변경 내용과 해당 변경 알림(~ INotifyCollectionChanged)이 원자성인지 확인합니다. 다른 스레드에서 액세스할 수 없습니다.  (일반적으로 무료입니다. instance ObservableCollection<T> 경우 모든 변경 내용이 동기화로 보호되는 경우 이를 보장합니다.)

  5. 를 호출 DisableCollectionSynchronization하는 경우 UI 스레드에서도 해당 호출이 발생해야 합니다.

  6. 여러 UI 스레드에서 동일한 컬렉션을 사용하려면 각 UI 스레드에서 (및 DisableCollectionSynchronization필요한 경우)를 별도로 호출 EnableCollectionSynchronization 해야 합니다.

  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 또는 해당 서브 클래스 중 하나 (ListBoxDataGrid, TreeView, ListView등.). WPF는 의 CollectionView하위 클래스를 통해 컬렉션에 대한 모든 액세스를 채널합니다. 및 는 ItemsControlCollectionView 모두 가 만들어진 스레드에 ItemsControl 대한 선호도를 가지며, 이는 다른 스레드에서 사용하는 것이 금지되어 예외를 throw한다는 것을 의미합니다. 실제로 이 제한은 컬렉션에도 적용됩니다.

여러 스레드에서 컬렉션을 사용할 수 있습니다.   예를 들어 데이터 수집이 진행되는 동안 UI가 응답성을 유지하도록 "사용자 인터페이스" 스레드에 결과를 표시하는 동안 "데이터 수집" 스레드에서 컬렉션을 업데이트(항목 추가 또는 제거)할 수 있습니다. 이러한 상황에서는 컬렉션에 대한 동기화된("스레드로부터 안전") 액세스를 보장하고 WPF(특히 에서)의 CollectionView액세스가 동일한 동기화 메커니즘에 참여하도록 보장할 책임이 있습니다. 메서드를 EnableCollectionSynchronization(IEnumerable, Object) 호출하면 간단한 잠금 메커니즘을 사용하여 이 작업을 수행할 수 있습니다.

여러 스레드에서 컬렉션을 사용하려면 다음을 수행해야 합니다. 그 중 하나는 를 소유 ItemsControl하는 UI 스레드입니다.

  1. 컬렉션에 액세스할 때 잠글 개체를 인스턴스화합니다.

  2. 해당 개체를 잠그는 방식으로 컬렉션에 애플리케이션의 모든 액세스를 동기화 합니다.

  3. 를 호출 EnableCollectionSynchronization(IEnumerable, Object) 하여 간단한 잠금 메커니즘을 사용하고 있음을 WPF에 알릴 수 있습니다.

    • 호출은 UI 스레드에서 발생해야 합니다.

    • 호출은 다른 스레드에서 컬렉션을 사용하거나 나중에 에 컬렉션을 ItemsControl연결하기 전에 발생해야 합니다.

  4. 컬렉션의 변경 내용과 해당 변경 알림(~ INotifyCollectionChanged)이 원자성인지 확인합니다. 다른 스레드에서 액세스할 수 없습니다.  (일반적으로 무료입니다. instance ObservableCollection<T> 경우 모든 변경 내용이 동기화로 보호되는 경우 이를 보장합니다.)

  5. 를 호출 DisableCollectionSynchronization하는 경우 UI 스레드에서도 해당 호출이 발생해야 합니다.

  6. 여러 UI 스레드에서 동일한 컬렉션을 사용하려면 각 UI 스레드에서 (및 DisableCollectionSynchronization필요한 경우)를 별도로 호출 EnableCollectionSynchronization 해야 합니다.

  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

컬렉션에 대한 액세스가 필요할 때마다 호출되는 콜백입니다. 한 번 하나의 스레드가 해당 컬렉션에 액세스하도록 사용할 수 있습니다.

설명

WPF 애플리케이션을 사용 하 여 데이터의 컬렉션을 표시할 수는 ItemsControl 또는 해당 서브 클래스 중 하나 (ListBoxDataGrid, TreeView, ListView등.). WPF는 의 CollectionView하위 클래스를 통해 컬렉션에 대한 모든 액세스를 채널합니다. 및 는 ItemsControlCollectionView 모두 가 만들어진 스레드에 ItemsControl 대한 선호도를 가지며, 이는 다른 스레드에서 사용하는 것이 금지되어 예외를 throw한다는 것을 의미합니다. 실제로 이 제한은 컬렉션에도 적용됩니다.

여러 스레드에서 컬렉션을 사용할 수 있습니다.   예를 들어 데이터 수집이 진행되는 동안 UI가 응답성을 유지하도록 "사용자 인터페이스" 스레드에 결과를 표시하는 동안 "데이터 수집" 스레드에서 컬렉션을 업데이트(항목 추가 또는 제거)할 수 있습니다. 이러한 상황에서는 컬렉션에 대한 동기화된("스레드로부터 안전") 액세스를 보장하고 WPF(특히 에서)의 CollectionView액세스가 동일한 동기화 메커니즘에 참여하도록 보장할 책임이 있습니다. 메서드를 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 호출하면 세마포, 다시 설정 이벤트 등과 같은 동기화 메커니즘을 사용하여 이 작업을 수행할 수 있습니다.

여러 스레드에서 컬렉션을 사용하려면 다음을 수행해야 합니다. 그 중 하나는 를 소유 ItemsControl하는 UI 스레드입니다.

  1. 동기화 메커니즘을 선택합니다.

  2. 이 메커니즘을 사용 하 여 컬렉션에 애플리케이션의 모든 액세스를 동기화 합니다.

  3. 오버로드를 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 호출하여 간단한 잠금 이외의 메커니즘을 사용하고 있음을 WPF에 알릴 수 있습니다.

    • 호출은 UI 스레드에서 발생해야 합니다.

    • 호출은 다른 스레드에서 컬렉션을 사용하거나 나중에 에 컬렉션을 ItemsControl연결하기 전에 발생해야 합니다.

  4. 컬렉션의 변경 내용과 해당 변경 알림(~ INotifyCollectionChanged)이 원자성인지 확인합니다. 다른 스레드에서 액세스할 수 없습니다.  (일반적으로 무료입니다. instance ObservableCollection<T> 경우 모든 변경 내용이 동기화로 보호되는 경우 이를 보장합니다.)

  5. 를 호출 DisableCollectionSynchronization하는 경우 UI 스레드에서도 해당 호출이 발생해야 합니다.

  6. 여러 UI 스레드에서 동일한 컬렉션을 사용하려면 각 UI 스레드에서 (및 DisableCollectionSynchronization필요한 경우)를 별도로 호출 EnableCollectionSynchronization 해야 합니다.

  7. 교착 상태를 방지합니다.    동기화를 사용 하도록 선택 하지만 것도 고려해 야 WPF의 참여는 동기화 후에 애플리케이션의 책임 이미입니다. (자세한 내용은 아래를 참조하세요.)

이에 대한 대가로 WPF는 다음과 같은 동작을 제공합니다.

  • CollectionView 다음 인수를 사용하여 등록된 CollectionSynchronizationCallback 를 호출하여 컬렉션에 액세스합니다.

    • collection: 관심 컬렉션입니다.
    • context: 등록된 컨텍스트 개체입니다.
    • accessMethod: 실제 액세스를 수행하는 대리자입니다.
    • writeAccess: true 대리자에서 컬렉션을 false 수정하면 이고, 그렇지 않으면 입니다.

    CollectionSynchronizationCallback 컬렉션에서 동기화를 설정해야 합니다(개체 및 writeAccess 값을 적절하게 사용context). 를 호출한 다음, 동기화를 accessMethod해제합니다.

  • CollectionView UI 스레드에서 사용할 컬렉션의 "섀도 복사본"을 유지 관리합니다.

  • CollectionChanged 이벤트가 도착하면(모든 스레드에서) 큐에 대기합니다.

  • 보류 중인 이벤트는 UI 스레드에서 섀도 복사본에 비동기적으로 적용됩니다.

  • CollectionView 는 직접 사용 하 여 애플리케이션에서 볼 다른 동기화 메커니즘입니다. 이는 교착 상태를 방지하는 데 도움이 되는 WPF의 방법입니다(이전 항목 7 참조).  

그 결과 모든 스레드에서 컬렉션을 변경할 수 있으며 UI 스레드가 "따라 잡을" 시간이 있는 경우 이러한 변경 내용이 결국 에 ItemsControl 표시됩니다.  구현은 백그라운드 스레드가 UI 스레드를 포화시키고 일반 사용자 입력에 대한 응답을 굶주리는 것을 막기 위해 UI 스레드로 이동하는 속도를 제한하도록 조정되었습니다.

context 매개 변수는 에 전달되는 callback임의의 개체입니다. 이를 사용하여 에 대한 액세스를 제어하는 데 사용되는 동기화 메커니즘을 collection확인할 수 있습니다. Context 는 일 null수 있습니다.

적용 대상