Share via


BindingOperations.EnableCollectionSynchronization Yöntem

Tanım

Bir CollectionView nesnenin birden çok iş parçacığında kullanılan bir koleksiyona eşitlenmiş erişime katılmasını sağlar.

Aşırı Yüklemeler

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView Bir nesnenin basit bir kilitleme mekanizması kullanarak birden çok iş parçacığında kullanılan bir koleksiyona eşitlenmiş erişime katılmasını sağlar.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Bir CollectionView nesnenin, basit bir kilit dışında bir mekanizma kullanarak birden çok iş parçacığında kullanılan bir koleksiyona eşitlenmiş erişime katılmasını sağlar.

Açıklamalar

WPF uygulaması, alt sınıflarından birini (ListBox, DataGrid, , TreeViewvbListView.) kullanarak veri ItemsControl koleksiyonunu görüntüleyebilir. WPF, bir alt sınıfı aracılığıyla koleksiyonuna tüm erişimini kanallandırır CollectionViewItemsControl hem hem de öğesinin CollectionView oluşturulduğu iş parçacığına ItemsControl benzine sahip olması, başka bir iş parçacığında kullanılmasının yasak olduğu ve bir özel durum oluşturduğu anlamına gelir. Bu kısıtlama, koleksiyon için de geçerlidir.

Koleksiyonu birden çok iş parçacığında kullanmak isteyebilirsiniz.   Örneğin, bir "veri toplama" iş parçacığındaki koleksiyonu güncelleştirmek (öğeleri ekleme veya kaldırma) ve sonuçları bir "kullanıcı arabirimi" iş parçacığında görüntüleyerek veri toplama sırasında kullanıcı arabiriminin yanıt vermeye devam edebilmesini sağlamak istiyorsunuz. Böyle bir durumda, koleksiyona eşitlenmiş ("iş parçacığı güvenli") erişim sağlamak sizin sorumluluğundadır.   Bu genellikle basit bir kilit mekanizması veya semaforlar, sıfırlama olayları vb. gibi daha ayrıntılı bir eşitleme mekanizması kullanılarak yapılır.

Uygulamanızın koleksiyona erişimini eşitlemeniz gerekir ancak WPF'den (özellikle 'den CollectionView) erişimin aynı eşitleme mekanizmasına katıldığını da garanti etmeniz gerekir.  Bunu yöntemini çağırarak EnableCollectionSynchronization yaparsınız.

Bir koleksiyonu birden çok iş parçacığında kullanmak için, bunlardan biri kullanıcı arabirimi iş parçacığıdır ItemsControlve bir uygulama aşağıdaki sorumluluklara sahiptir:

  1. Bir eşitleme mekanizması seçin.

  2. Bu mekanizmayı kullanarak uygulamadan koleksiyona tüm erişimi eşitleyin.

  3. WPF'yi mekanizma hakkında bilgilendirmek için çağrısı EnableCollectionSynchronization .

  4. Koleksiyonda yapılan bir değişikliğin ve bu değişikliğin bildiriminin (aracılığıyla INotifyCollectionChanged) atomik olduğundan emin olun; diğer iş parçacıklarından hiçbir erişim müdahalede bulunmaz.  (Bu genellikle ücretsizdir. Örneğin, ObservableCollection<T> tüm değişikliklerin eşitleme tarafından korunması koşuluyla bunu garanti eder.)

  5. çağrısı DisableCollectionSynchronizationyaparsanız, bu çağrı kullanıcı arabirimi iş parçacığında da gerçekleşmelidir.

  6. Aynı koleksiyonu birden çok kullanıcı arabirimi iş parçacığında kullanmak istiyorsanız, her ui iş parçacığında (ve DisableCollectionSynchronizationgerekirse) ayrı ayrı çağırmanız EnableCollectionSynchronization gerekir.

  7. Kilitlenmekten kaçının.  Bu, eşitlemeyi kullanmayı seçtikten sonra zaten uygulamanın sorumluluğundadır, ancak aşağıdaki paragrafta açıklandığı gibi WPF'nin eşitlemeye katılımını da dikkate almalıdır.

Buna karşılık WPF aşağıdaki davranışı sağlar:

  • verilen CollectionView eşitleme mekanizmasını kullanarak koleksiyona erişir.

  • , CollectionView kullanıcı arabirimi iş parçacığında kullanılmak üzere koleksiyonun "gölge kopyasını" tutar.

  • CollectionChanged olaylar geldikçe kuyruğa alınır (herhangi bir iş parçacığında).

  • Bekleyen olaylar, bunu yapma fırsatı olduğunda kullanıcı arabirimi iş parçacığında zaman uyumsuz olarak gölge kopyaya uygulanır.

  • doğrudan CollectionView uygulama tarafından görülebilen başka bir eşitleme mekanizması kullanmaz. Bu WPF'nin kilitlenmeyi önlemeye yardımcı olan yoludur (önceki öğe 7'ye bakın).  

Net etkisi, koleksiyonu herhangi bir iş parçacığında değiştirebilmenizdir ve bu değişiklikler sonunda kullanıcı arabirimi iş parçacığının ItemsControl "yakalama" zamanı olduğunda görünür.  Uygulama, arka plan iş parçacıklarının kullanıcı arabirimi iş parçacığını doygunluğundan ve yanıtın normal kullanıcı girişine yanıt vermemeye devam etmemesi için ui iş parçacığına akışı değiştiren hızı azaltacak şekilde ayarlanmıştır.

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView Bir nesnenin basit bir kilitleme mekanizması kullanarak birden çok iş parçacığında kullanılan bir koleksiyona eşitlenmiş erişime katılmasını sağlar.

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)

Parametreler

collection
IEnumerable

Eşitlenmiş erişim gerektiren koleksiyon.

lockObject
Object

Koleksiyona erişirken kilitlenmek üzere nesne.

Açıklamalar

WPF uygulaması, alt sınıflarından birini (ListBox, DataGrid, , TreeViewvbListView.) kullanarak veri ItemsControl koleksiyonunu görüntüleyebilir. WPF, bir alt sınıfı aracılığıyla koleksiyonuna tüm erişimini kanallandırır CollectionViewItemsControl hem hem de öğesinin CollectionView oluşturulduğu iş parçacığına ItemsControl benzine sahip olması, başka bir iş parçacığında kullanılmasının yasak olduğu ve bir özel durum oluşturduğu anlamına gelir. Bu kısıtlama, koleksiyon için de geçerlidir.

Koleksiyonu birden çok iş parçacığında kullanmak isteyebilirsiniz.   Örneğin, bir "veri toplama" iş parçacığındaki koleksiyonu güncelleştirmek (öğeleri ekleme veya kaldırma) ve sonuçları bir "kullanıcı arabirimi" iş parçacığında görüntüleyerek veri toplama sırasında kullanıcı arabiriminin yanıt vermeye devam edebilmesini sağlamak istiyorsunuz. Böyle bir durumda, koleksiyona eşitlenmiş ("iş parçacığı açısından güvenli") erişim sağlamaktan ve WPF'den (özellikle 'den CollectionView) erişimin aynı eşitleme mekanizmasına katıldığını garanti etmek sizin sorumluluğundadır. yöntemini çağırarak EnableCollectionSynchronization(IEnumerable, Object) bunu basit bir kilit mekanizması kullanarak yapabilirsiniz.

Bir koleksiyonu birden çok iş parçacığında kullanmak için, bunlardan biri öğesinin sahibi ItemsContrololan kullanıcı arabirimi iş parçacığıdır, aşağıdakileri yapmalısınız:

  1. Koleksiyona erişirken kilitlenmesi için bir nesne örneği oluşturun.

  2. Bu nesneyi kilitleyerek uygulamadan koleksiyona tüm erişimi eşitleyin.

  3. Basit bir kilit mekanizması kullandığınızı WPF'ye bildirmek için çağrısı EnableCollectionSynchronization(IEnumerable, Object) .

    • Çağrı, kullanıcı arabirimi iş parçacığında gerçekleşmelidir.

    • Çağrısı, koleksiyonu farklı bir iş parçacığında kullanmadan önce veya koleksiyonu ItemsControlöğesine eklemeden önce (hangisi daha sonraysa) gerçekleşmelidir.

  4. Koleksiyonda yapılan bir değişikliğin ve bu değişikliğin bildiriminin (aracılığıyla INotifyCollectionChanged) atomik olduğundan emin olun; diğer iş parçacıklarından hiçbir erişim müdahalede bulunmaz.  (Bu genellikle ücretsizdir. Örneğin, ObservableCollection<T> tüm değişikliklerin eşitleme tarafından korunması koşuluyla bunu garanti eder.)

  5. çağrısı DisableCollectionSynchronizationyaparsanız, bu çağrı kullanıcı arabirimi iş parçacığında da gerçekleşmelidir.

  6. Aynı koleksiyonu birden çok kullanıcı arabirimi iş parçacığında kullanmak istiyorsanız, her ui iş parçacığında (ve DisableCollectionSynchronizationgerekirse) ayrı ayrı çağırmanız EnableCollectionSynchronization gerekir.

  7. Kilitlenmekten kaçının.  Eşitlemeyi kullanmayı seçtikten sonra bu zaten uygulamanın sorumluluğundadır, ancak WPF'nin eşitlemeye katılımını da dikkate almalıdır. (Daha fazla bilgi için aşağıya bakın.)

Buna karşılık WPF aşağıdaki davranışı sağlar:

  • , CollectionView kilitleme mekanizmasını kullanarak koleksiyona erişir.

  • , CollectionView kullanıcı arabirimi iş parçacığında kullanılmak üzere koleksiyonun "gölge kopyasını" tutar.

  • CollectionChanged olaylar geldikçe kuyruğa alınır (herhangi bir iş parçacığında).

  • Bekleyen olaylar, bunu yapma fırsatı olduğunda kullanıcı arabirimi iş parçacığında zaman uyumsuz olarak gölge kopyaya uygulanır.

  • doğrudan CollectionView uygulama tarafından görülebilen başka bir eşitleme mekanizması kullanmaz. Bu WPF'nin kilitlenmeyi önlemeye yardımcı olan yoludur (önceki öğe 7'ye bakın).  

Net etkisi, koleksiyonu herhangi bir iş parçacığında değiştirebilmenizdir ve bu değişiklikler sonunda kullanıcı arabirimi iş parçacığının ItemsControl "yakalama" zamanı olduğunda görünür.  Uygulama, arka plan iş parçacıklarının kullanıcı arabirimi iş parçacığını doygunluğundan ve yanıtın normal kullanıcı girişine yanıt vermemeye devam etmemesi için ui iş parçacığına akışı değiştiren hızı azaltacak şekilde ayarlanmıştır.

Şunlara uygulanır

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Bir CollectionView nesnenin, basit bir kilit dışında bir mekanizma kullanarak birden çok iş parçacığında kullanılan bir koleksiyona eşitlenmiş erişime katılmasını sağlar.

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)

Parametreler

collection
IEnumerable

Eşitlenmiş erişim gerektiren koleksiyon.

context
Object

Geri çağırmaya geçirilen bir nesne.

synchronizationCallback
CollectionSynchronizationCallback

Koleksiyona her erişim gerektiğinde çağrılan geri çağırma. Koleksiyona bir kerede bir iş parçacığı tarafından erişildiğinden emin olmak için bunu kullanabilirsiniz.

Açıklamalar

WPF uygulaması, alt sınıflarından birini (ListBox, DataGrid, , TreeViewvbListView.) kullanarak veri ItemsControl koleksiyonunu görüntüleyebilir. WPF, bir alt sınıfı aracılığıyla koleksiyonuna tüm erişimini kanallandırır CollectionViewItemsControl hem hem de öğesinin CollectionView oluşturulduğu iş parçacığına ItemsControl benzine sahip olması, başka bir iş parçacığında kullanılmasının yasak olduğu ve bir özel durum oluşturduğu anlamına gelir. Bu kısıtlama, koleksiyon için de geçerlidir.

Koleksiyonu birden çok iş parçacığında kullanmak isteyebilirsiniz.   Örneğin, bir "veri toplama" iş parçacığındaki koleksiyonu güncelleştirmek (öğeleri ekleme veya kaldırma) ve sonuçları bir "kullanıcı arabirimi" iş parçacığında görüntüleyerek veri toplama sırasında kullanıcı arabiriminin yanıt vermeye devam edebilmesini sağlamak istiyorsunuz. Böyle bir durumda, koleksiyona eşitlenmiş ("iş parçacığı açısından güvenli") erişim sağlamaktan ve WPF'den (özellikle 'den CollectionView) erişimin aynı eşitleme mekanizmasına katıldığını garanti etmek sizin sorumluluğundadır. yöntemini çağırarak EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) , semaforlar, sıfırlama olayı vb. gibi bir eşitleme mekanizması kullanarak bunu yapabilirsiniz.

Bir koleksiyonu birden çok iş parçacığında kullanmak için, bunlardan biri öğesinin sahibi ItemsContrololan kullanıcı arabirimi iş parçacığıdır, aşağıdakileri yapmalısınız:

  1. Bir eşitleme mekanizması seçin.

  2. Bu mekanizmayı kullanarak uygulamadan koleksiyona tüm erişimi eşitleyin.

  3. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) BASIT kilitleme dışında bir mekanizma kullandığınızı WPF'ye bildirmek için aşırı yüklemeyi çağırın.

    • Çağrı, kullanıcı arabirimi iş parçacığında gerçekleşmelidir.

    • Çağrısı, koleksiyonu farklı bir iş parçacığında kullanmadan önce veya koleksiyonu ItemsControlöğesine eklemeden önce (hangisi daha sonraysa) gerçekleşmelidir.

  4. Koleksiyonda yapılan bir değişikliğin ve bu değişikliğin bildiriminin (aracılığıyla INotifyCollectionChanged) atomik olduğundan emin olun; diğer iş parçacıklarından hiçbir erişim müdahalede bulunmaz.  (Bu genellikle ücretsizdir. Örneğin, ObservableCollection<T> tüm değişikliklerin eşitleme tarafından korunması koşuluyla bunu garanti eder.)

  5. çağrısı DisableCollectionSynchronizationyaparsanız, bu çağrı kullanıcı arabirimi iş parçacığında da gerçekleşmelidir.

  6. Aynı koleksiyonu birden çok kullanıcı arabirimi iş parçacığında kullanmak istiyorsanız, her ui iş parçacığında (ve DisableCollectionSynchronizationgerekirse) ayrı ayrı çağırmanız EnableCollectionSynchronization gerekir.

  7. Kilitlenmekten kaçının.  Eşitlemeyi kullanmayı seçtikten sonra bu zaten uygulamanın sorumluluğundadır, ancak WPF'nin eşitlemeye katılımını da dikkate almalıdır. (Daha fazla bilgi için aşağıya bakın.)

Buna karşılık WPF aşağıdaki davranışı sağlar:

  • , CollectionView aşağıdaki bağımsız değişkenlerle kayıtlı CollectionSynchronizationCallback öğesini çağırarak koleksiyona erişir:

    • collection: ilgi alanı koleksiyonu.
    • context: kayıtlı bağlam nesnesi.
    • accessMethod: gerçek erişimi gerçekleştiren bir temsilci.
    • writeAccess: true temsilci koleksiyonu değiştirecekse; false aksi takdirde.

    Koleksiyonda CollectionSynchronizationCallback eşitleme oluşturmalısınız (uygun şekilde nesnesini ve writeAccess değerini kullanarakcontext), öğesini çağırıp eşitlemeyi accessMethodserbest bırakın.

  • , CollectionView kullanıcı arabirimi iş parçacığında kullanılmak üzere koleksiyonun "gölge kopyasını" tutar.

  • CollectionChanged olaylar geldikçe kuyruğa alınır (herhangi bir iş parçacığında).

  • Bekleyen olaylar, bunu yapma fırsatı olduğunda kullanıcı arabirimi iş parçacığında zaman uyumsuz olarak gölge kopyaya uygulanır.

  • doğrudan CollectionView uygulama tarafından görülebilen başka bir eşitleme mekanizması kullanmaz. Bu WPF'nin kilitlenmeyi önlemeye yardımcı olan yoludur (önceki öğe 7'ye bakın).  

Net etkisi, koleksiyonu herhangi bir iş parçacığında değiştirebilmenizdir ve bu değişiklikler sonunda kullanıcı arabirimi iş parçacığının ItemsControl "yakalama" zamanı olduğunda görünür.  Uygulama, arka plan iş parçacıklarının kullanıcı arabirimi iş parçacığını doygunluğundan ve yanıtın normal kullanıcı girişine yanıt vermemeye devam etmemesi için ui iş parçacığına akışı değiştiren hızı azaltacak şekilde ayarlanmıştır.

context parametresi, öğesine callbackgeçirilen rastgele bir nesnedir. erişimi denetlemek için kullanılan eşitleme mekanizmasını belirlemek için collectionbunu kullanabilirsiniz. Context olabilir null.

Şunlara uygulanır