BindingOperations.EnableCollectionSynchronization 메서드
정의
중요
일부 정보는 릴리스되기 전에 상당 부분 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적이거나 묵시적인 보증도 하지 않습니다.
개체가 CollectionView 여러 스레드에서 사용되는 컬렉션에 대한 동기화된 액세스에 참여할 수 있도록 합니다.
오버로드
| Name | Description |
|---|---|
| EnableCollectionSynchronization(IEnumerable, Object) |
개체가 CollectionView 간단한 잠금 메커니즘을 사용하여 여러 스레드에서 사용되는 컬렉션에 대한 동기화된 액세스에 참여할 수 있도록 합니다. |
| EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
개체가 CollectionView 단순 잠금 이외의 메커니즘을 사용하여 여러 스레드에서 사용되는 컬렉션에 대한 동기화된 액세스에 참여할 수 있도록 합니다. |
설명
WPF 애플리케이션은 ItemsControl 또는 해당 서브클래스 중 하나를 사용하여 데이터 컬렉션을 표시할 수 있습니다(ListBox, DataGrid, TreeView, ListView 등). WPF CollectionView 하위 클래스를 통해 컬렉션에 대한 모든 액세스를 채널합니다. ItemsControl 둘 다 생성된 스레드 CollectionView 에 ItemsControl 대한 선호도를 가지므로 다른 스레드에서 사용하는 것은 금지되며 예외를 throw합니다. 실제로 이 제한은 컬렉션에도 적용됩니다.
여러 스레드에서 컬렉션을 사용할 수 있습니다. 예를 들어 데이터 수집이 진행되는 동안 UI가 응답성을 유지하도록 "사용자 인터페이스" 스레드에 결과를 표시하는 동안 "데이터 수집" 스레드에서 컬렉션을 업데이트(항목 추가 또는 제거)할 수 있습니다. 이러한 상황에서는 컬렉션에 대한 동기화된("스레드로부터 안전한") 액세스를 보장할 책임이 있습니다. 이 작업은 일반적으로 간단한 잠금 메커니즘 또는 세마포, 다시 설정 이벤트 등과 같은 보다 정교한 동기화 메커니즘을 사용하여 수행됩니다.
컬렉션에 대한 애플리케이션의 액세스를 동기화해야 하지만 WPF(특히 CollectionView)의 액세스가 동일한 동기화 메커니즘에 참여하도록 보장해야 합니다. 이 작업은 메서드를 호출하여 수행합니다 EnableCollectionSynchronization .
여러 스레드에서 컬렉션을 사용하려면 그 중 하나는 소유 ItemsControl하는 UI 스레드이며 애플리케이션에는 다음과 같은 책임이 있습니다.
동기화 메커니즘을 선택합니다.
해당 메커니즘을 사용하여 애플리케이션의 모든 액세스를 컬렉션에 동기화합니다.
EnableCollectionSynchronization 호출하여 메커니즘의 WPF 알릴 수 있습니다.
호출은 UI 스레드에서 발생해야 합니다.
호출은 다른 스레드에서 컬렉션을 사용하기 전에 또는 컬렉션을 나중에 연결하기 ItemsControl전에 발생해야 합니다.
간단한 잠금 메커니즘을 EnableCollectionSynchronization(IEnumerable, Object) 사용하는 경우 오버로드를 호출하고 보다 정교한 메커니즘을 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 사용하는 경우 오버로드를 호출합니다.
컬렉션 변경 및 해당 변경 알림(통과 INotifyCollectionChanged)이 원자성인지 확인합니다. 다른 스레드의 액세스가 개입할 수 없습니다. (일반적으로 무료입니다. 예를 들어 ObservableCollection<T> 모든 변경 내용이 동기화로 보호되는 경우 이를 보장합니다.)
호출 DisableCollectionSynchronization하는 경우 해당 호출은 UI 스레드에서도 발생해야 합니다.
여러 UI 스레드에서 동일한 컬렉션을 사용하려면 각 UI 스레드에서 별도로 호출 EnableCollectionSynchronization (및 DisableCollectionSynchronization필요한 경우)해야 합니다.
교착 상태를 방지합니다. 동기화를 사용하도록 선택한 후에는 이미 애플리케이션의 책임이지만 다음 단락에서 설명한 대로 동기화에 참여하는 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 등). WPF CollectionView 하위 클래스를 통해 컬렉션에 대한 모든 액세스를 채널합니다. ItemsControl 둘 다 생성된 스레드 CollectionView 에 ItemsControl 대한 선호도를 가지므로 다른 스레드에서 사용하는 것은 금지되며 예외를 throw합니다. 실제로 이 제한은 컬렉션에도 적용됩니다.
여러 스레드에서 컬렉션을 사용할 수 있습니다. 예를 들어 데이터 수집이 진행되는 동안 UI가 응답성을 유지하도록 "사용자 인터페이스" 스레드에 결과를 표시하는 동안 "데이터 수집" 스레드에서 컬렉션을 업데이트(항목 추가 또는 제거)할 수 있습니다. 이러한 상황에서는 컬렉션에 대한 동기화된("스레드로부터 안전") 액세스를 보장하고 WPF(특히 CollectionView)의 액세스가 동일한 동기화 메커니즘에 참여하도록 보장할 책임이 있습니다. 메서드를 EnableCollectionSynchronization(IEnumerable, Object) 호출하면 간단한 잠금 메커니즘을 사용하여 이 작업을 수행할 수 있습니다.
여러 스레드에서 컬렉션을 사용하려면 다음을 수행해야 합니다. 그 중 하나는 소유하는 ItemsControlUI 스레드입니다.
컬렉션에 액세스할 때 잠글 개체를 인스턴스화합니다.
해당 개체를 잠금하여 애플리케이션에서 컬렉션으로의 모든 액세스를 동기화합니다.
EnableCollectionSynchronization(IEnumerable, Object) 호출하여 WPF 간단한 잠금 메커니즘을 사용하고 있음을 알릴 수 있습니다.
호출은 UI 스레드에서 발생해야 합니다.
호출은 다른 스레드에서 컬렉션을 사용하기 전에 또는 컬렉션을 나중에 연결하기 ItemsControl전에 발생해야 합니다.
컬렉션 변경 및 해당 변경 알림(통과 INotifyCollectionChanged)이 원자성인지 확인합니다. 다른 스레드의 액세스가 개입할 수 없습니다. (일반적으로 무료입니다. 예를 들어 ObservableCollection<T> 모든 변경 내용이 동기화로 보호되는 경우 이를 보장합니다.)
호출 DisableCollectionSynchronization하는 경우 해당 호출은 UI 스레드에서도 발생해야 합니다.
여러 UI 스레드에서 동일한 컬렉션을 사용하려면 각 UI 스레드에서 별도로 호출 EnableCollectionSynchronization (및 DisableCollectionSynchronization필요한 경우)해야 합니다.
교착 상태를 방지합니다. 동기화를 사용하도록 선택한 후에는 이미 애플리케이션의 책임이지만 동기화에 참여하는 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 또는 해당 서브클래스 중 하나를 사용하여 데이터 컬렉션을 표시할 수 있습니다(ListBox, DataGrid, TreeView, ListView 등). WPF CollectionView 하위 클래스를 통해 컬렉션에 대한 모든 액세스를 채널합니다. ItemsControl 둘 다 생성된 스레드 CollectionView 에 ItemsControl 대한 선호도를 가지므로 다른 스레드에서 사용하는 것은 금지되며 예외를 throw합니다. 실제로 이 제한은 컬렉션에도 적용됩니다.
여러 스레드에서 컬렉션을 사용할 수 있습니다. 예를 들어 데이터 수집이 진행되는 동안 UI가 응답성을 유지하도록 "사용자 인터페이스" 스레드에 결과를 표시하는 동안 "데이터 수집" 스레드에서 컬렉션을 업데이트(항목 추가 또는 제거)할 수 있습니다. 이러한 상황에서는 컬렉션에 대한 동기화된("스레드로부터 안전") 액세스를 보장하고 WPF(특히 CollectionView)의 액세스가 동일한 동기화 메커니즘에 참여하도록 보장할 책임이 있습니다. 메서드를 EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 호출하면 세마포, 다시 설정 이벤트 등의 동기화 메커니즘을 사용하여 이 작업을 수행할 수 있습니다.
여러 스레드에서 컬렉션을 사용하려면 다음을 수행해야 합니다. 그 중 하나는 소유하는 ItemsControlUI 스레드입니다.
동기화 메커니즘을 선택합니다.
해당 메커니즘을 사용하여 애플리케이션의 모든 액세스를 컬렉션에 동기화합니다.
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) 오버로드를 호출하여 간단한 잠금 이외의 메커니즘을 사용하고 있음을 WPF 알릴 수 있습니다.
호출은 UI 스레드에서 발생해야 합니다.
호출은 다른 스레드에서 컬렉션을 사용하기 전에 또는 컬렉션을 나중에 연결하기 ItemsControl전에 발생해야 합니다.
컬렉션 변경 및 해당 변경 알림(통과 INotifyCollectionChanged)이 원자성인지 확인합니다. 다른 스레드의 액세스가 개입할 수 없습니다. (일반적으로 무료입니다. 예를 들어 ObservableCollection<T> 모든 변경 내용이 동기화로 보호되는 경우 이를 보장합니다.)
호출 DisableCollectionSynchronization하는 경우 해당 호출은 UI 스레드에서도 발생해야 합니다.
여러 UI 스레드에서 동일한 컬렉션을 사용하려면 각 UI 스레드에서 별도로 호출 EnableCollectionSynchronization (및 DisableCollectionSynchronization필요한 경우)해야 합니다.
교착 상태를 방지합니다. 동기화를 사용하도록 선택한 후에는 이미 애플리케이션의 책임이지만 동기화에 참여하는 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수 있습니다.