Udostępnij za pośrednictwem


BindingOperations.EnableCollectionSynchronization Metoda

Definicja

CollectionView Umożliwia udział obiektu w zsynchronizowanym dostępie do kolekcji używanej w wielu wątkach.

Przeciążenia

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView Umożliwia udział obiektu w zsynchronizowanym dostępie do kolekcji używanej w wielu wątkach przy użyciu prostego mechanizmu blokowania.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

CollectionView Umożliwia udział obiektu w zsynchronizowanym dostępie do kolekcji używanej w wielu wątkach przy użyciu mechanizmu innego niż prosta blokada.

Uwagi

Aplikacja WPF może wyświetlać zbieranie danych przy użyciu jednej ItemsControl z jego podklas (ListBox, DataGrid, , TreeViewListViewitp.). Wszystkie kanały WPF mają dostęp do kolekcji za pośrednictwem podklasy CollectionView. Zarówno element ItemsControl i CollectionView mają koligację do wątku, na którym ItemsControl utworzono element, co oznacza, że używanie ich w innym wątku jest zabronione i zgłasza wyjątek. W efekcie to ograniczenie dotyczy również kolekcji.

Możesz użyć kolekcji w wielu wątkach.   Na przykład chcesz zaktualizować kolekcję (dodać lub usunąć elementy) w wątku "zbieranie danych", wyświetlając wyniki w wątku "interfejs użytkownika", aby interfejs użytkownika był dynamiczny podczas zbierania danych. W takiej sytuacji ponosisz odpowiedzialność za zapewnienie zsynchronizowanego dostępu do kolekcji ("bezpieczne wątkowo").   Zazwyczaj odbywa się to przy użyciu prostego mechanizmu blokady lub bardziej rozbudowanego mechanizmu synchronizacji, takiego jak semafory, zdarzenia resetowania itp.

Podczas gdy musisz zsynchronizować dostęp aplikacji do kolekcji, musisz również zagwarantować, że dostęp z WPF (w szczególności z CollectionViewprogramu ) uczestniczy w tym samym mechanizmie synchronizacji.  W tym celu należy wywołać metodę EnableCollectionSynchronization .

Aby użyć kolekcji w wielu wątkach, z których jeden jest wątkiem interfejsu ItemsControlużytkownika, który jest właścicielem , aplikacja ma następujące obowiązki:

  1. Wybierz mechanizm synchronizacji.

  2. Zsynchronizuj cały dostęp z aplikacji do kolekcji przy użyciu tego mechanizmu.

  3. Wywołaj polecenie EnableCollectionSynchronization , aby poinformować WPF o mechanizmie.

  4. Upewnij się, że zmiana kolekcji i powiadomienie o tej zmianie (za pośrednictwem INotifyCollectionChanged) są niepodzielne; nie można interweniować dostępu z innych wątków.  (Zazwyczaj jest to bezpłatne. Na przykład gwarantuje to, ObservableCollection<T> że wszystkie zmiany są chronione przez synchronizację).

  5. Jeśli wywołasz metodę DisableCollectionSynchronization, to wywołanie musi również wystąpić w wątku interfejsu użytkownika.

  6. Jeśli chcesz użyć tej samej kolekcji w wielu wątkach interfejsu użytkownika, musisz wywołać EnableCollectionSynchronization metodę (i DisableCollectionSynchronization, w razie potrzeby) oddzielnie w każdym wątku interfejsu użytkownika.

  7. Unikaj zakleszczenia.  Jest to już odpowiedzialność aplikacji po wybraniu korzystania z synchronizacji, ale musi również uwzględniać udział WPF w synchronizacji, zgodnie z opisem w poniższym akapicie.

W zamian WPF zapewnia następujące zachowanie:

  • Uzyskuje CollectionView dostęp do kolekcji przy użyciu danego mechanizmu synchronizacji.

  • Obiekt CollectionView obsługuje "kopię w tle" kolekcji do użycia w wątku interfejsu użytkownika.

  • CollectionChanged zdarzenia są umieszczone w kolejce po nadejściu (w dowolnym wątku).

  • Oczekujące zdarzenia są stosowane do kopii w tle asynchronicznie w wątku interfejsu użytkownika, gdy ma możliwość wykonania tego zadania.

  • Narzędzie CollectionView nie będzie bezpośrednio używać żadnego innego mechanizmu synchronizacji widocznego dla aplikacji. Jest to sposób WPF na uniknięcie zakleszczenia (zobacz poprzedni element 7).  

Efekt netto polega na tym, że można zmienić kolekcję w dowolnym wątku, a te zmiany w końcu pojawią się w momencie ItemsControl , gdy wątek interfejsu użytkownika ma czas na "nadrobienie zaległości".  Implementacja została dostrojona, aby ograniczyć szybkość, która zmienia przepływ do wątku interfejsu użytkownika, aby zachować wątki w tle przed saturowaniem wątku interfejsu użytkownika i głodowaniem odpowiedzi na dane wejściowe normalnego użytkownika.

EnableCollectionSynchronization(IEnumerable, Object)

CollectionView Umożliwia udział obiektu w zsynchronizowanym dostępie do kolekcji używanej w wielu wątkach przy użyciu prostego mechanizmu blokowania.

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)

Parametry

collection
IEnumerable

Kolekcja, która wymaga zsynchronizowanych dostępu.

lockObject
Object

Obiekt, który ma być zablokowany podczas uzyskiwania dostępu do kolekcji.

Uwagi

Aplikacja WPF może wyświetlać zbieranie danych przy użyciu jednej ItemsControl z jego podklas (ListBox, DataGrid, , TreeViewListViewitp.). Wszystkie kanały WPF mają dostęp do kolekcji za pośrednictwem podklasy CollectionView. Zarówno element ItemsControl i CollectionView mają koligację do wątku, na którym ItemsControl utworzono element, co oznacza, że używanie ich w innym wątku jest zabronione i zgłasza wyjątek. W efekcie to ograniczenie dotyczy również kolekcji.

Możesz użyć kolekcji w wielu wątkach.   Na przykład chcesz zaktualizować kolekcję (dodać lub usunąć elementy) w wątku "zbieranie danych", wyświetlając wyniki w wątku "interfejs użytkownika", aby interfejs użytkownika był dynamiczny podczas zbierania danych. W takiej sytuacji ponosisz odpowiedzialność za zapewnienie zsynchronizowanego dostępu ("bezpieczne wątkowo") do kolekcji i zagwarantowania, że dostęp z WPF (w szczególności z CollectionViewprogramu ) uczestniczy w tym samym mechanizmie synchronizacji. Wywołając metodę EnableCollectionSynchronization(IEnumerable, Object) , można to zrobić za pomocą prostego mechanizmu blokady.

Aby użyć kolekcji w wielu wątkach, z których jeden jest wątkiem interfejsu użytkownika, który jest właścicielem ItemsControlelementu , należy wykonać następujące czynności:

  1. Utwórz wystąpienie obiektu w celu zablokowania podczas uzyskiwania dostępu do kolekcji.

  2. Zsynchronizuj cały dostęp z aplikacji do kolekcji, blokując ten obiekt.

  3. Wywołaj polecenie EnableCollectionSynchronization(IEnumerable, Object) , aby poinformować WPF, że używasz prostego mechanizmu blokady.

    • Wywołanie musi wystąpić w wątku interfejsu użytkownika.

    • Wywołanie musi nastąpić przed użyciem kolekcji w innym wątku lub przed dołączeniem kolekcji do ItemsControlelementu , w zależności od tego, co nastąpi później.

  4. Upewnij się, że zmiana kolekcji i powiadomienie o tej zmianie (za pośrednictwem INotifyCollectionChanged) są niepodzielne; nie można interweniować dostępu z innych wątków.  (Zazwyczaj jest to bezpłatne. Na przykład gwarantuje to, ObservableCollection<T> że wszystkie zmiany są chronione przez synchronizację).

  5. Jeśli wywołasz metodę DisableCollectionSynchronization, to wywołanie musi również wystąpić w wątku interfejsu użytkownika.

  6. Jeśli chcesz użyć tej samej kolekcji w wielu wątkach interfejsu użytkownika, musisz wywołać EnableCollectionSynchronization metodę (i DisableCollectionSynchronization, w razie potrzeby) oddzielnie w każdym wątku interfejsu użytkownika.

  7. Unikaj zakleszczenia.  Jest to już odpowiedzialność aplikacji po wybraniu synchronizacji, ale musi również uwzględnić udział WPF w synchronizacji. (Zobacz więcej, poniżej).

W zamian WPF zapewnia następujące zachowanie:

  • Uzyskuje CollectionView dostęp do kolekcji przy użyciu mechanizmu blokowania.

  • Obiekt CollectionView obsługuje "kopię w tle" kolekcji do użycia w wątku interfejsu użytkownika.

  • CollectionChanged zdarzenia są umieszczone w kolejce po nadejściu (w dowolnym wątku).

  • Oczekujące zdarzenia są stosowane do kopii w tle asynchronicznie w wątku interfejsu użytkownika, gdy ma możliwość wykonania tego zadania.

  • Narzędzie CollectionView nie będzie bezpośrednio używać żadnego innego mechanizmu synchronizacji widocznego dla aplikacji. Jest to sposób WPF na uniknięcie zakleszczenia (zobacz poprzedni element 7).  

Efekt netto polega na tym, że można zmienić kolekcję w dowolnym wątku, a te zmiany w końcu pojawią się w momencie ItemsControl , gdy wątek interfejsu użytkownika ma czas na "nadrobienie zaległości".  Implementacja została dostrojona, aby ograniczyć szybkość, która zmienia przepływ do wątku interfejsu użytkownika, aby zachować wątki w tle przed saturowaniem wątku interfejsu użytkownika i głodowaniem odpowiedzi na dane wejściowe normalnego użytkownika.

Dotyczy

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

CollectionView Umożliwia udział obiektu w zsynchronizowanym dostępie do kolekcji używanej w wielu wątkach przy użyciu mechanizmu innego niż prosta blokada.

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)

Parametry

collection
IEnumerable

Kolekcja, która wymaga zsynchronizowanych dostępu.

context
Object

Obiekt przekazany do wywołania zwrotnego.

synchronizationCallback
CollectionSynchronizationCallback

Wywołanie zwrotne wywoływane za każdym razem, gdy jest wymagany dostęp do kolekcji. Można go użyć, aby upewnić się, że kolekcja jest uzyskiwana przez jeden wątek jednocześnie.

Uwagi

Aplikacja WPF może wyświetlać zbieranie danych przy użyciu jednej ItemsControl z jego podklas (ListBox, DataGrid, , TreeViewListViewitp.). Wszystkie kanały WPF mają dostęp do kolekcji za pośrednictwem podklasy CollectionView. Zarówno element ItemsControl i CollectionView mają koligację do wątku, na którym ItemsControl utworzono element, co oznacza, że używanie ich w innym wątku jest zabronione i zgłasza wyjątek. W efekcie to ograniczenie dotyczy również kolekcji.

Możesz użyć kolekcji w wielu wątkach.   Na przykład chcesz zaktualizować kolekcję (dodać lub usunąć elementy) w wątku "zbieranie danych", wyświetlając wyniki w wątku "interfejs użytkownika", aby interfejs użytkownika był dynamiczny podczas zbierania danych. W takiej sytuacji ponosisz odpowiedzialność za zapewnienie zsynchronizowanego dostępu ("bezpieczne wątkowo") do kolekcji i zagwarantowania, że dostęp z WPF (w szczególności z CollectionViewprogramu ) uczestniczy w tym samym mechanizmie synchronizacji. Wywołając metodę EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) , można to zrobić za pomocą mechanizmu synchronizacji, takiego jak semaphores, zdarzenie resetowania itp.

Aby użyć kolekcji w wielu wątkach, z których jeden jest wątkiem interfejsu użytkownika, który jest właścicielem ItemsControlelementu , należy wykonać następujące czynności:

  1. Wybierz mechanizm synchronizacji.

  2. Zsynchronizuj cały dostęp z aplikacji do kolekcji przy użyciu tego mechanizmu.

  3. Wywołaj EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) przeciążenie, aby poinformować WPF, że używasz mechanizmu innego niż proste blokowanie.

    • Wywołanie musi wystąpić w wątku interfejsu użytkownika.

    • Wywołanie musi nastąpić przed użyciem kolekcji w innym wątku lub przed dołączeniem kolekcji do ItemsControlelementu , w zależności od tego, co nastąpi później.

  4. Upewnij się, że zmiana kolekcji i powiadomienie o tej zmianie (za pośrednictwem INotifyCollectionChanged) są niepodzielne; nie można interweniować dostępu z innych wątków.  (Zazwyczaj jest to bezpłatne. Na przykład gwarantuje to, ObservableCollection<T> że wszystkie zmiany są chronione przez synchronizację).

  5. Jeśli wywołasz metodę DisableCollectionSynchronization, to wywołanie musi również wystąpić w wątku interfejsu użytkownika.

  6. Jeśli chcesz użyć tej samej kolekcji w wielu wątkach interfejsu użytkownika, musisz wywołać EnableCollectionSynchronization metodę (i DisableCollectionSynchronization, w razie potrzeby) oddzielnie w każdym wątku interfejsu użytkownika.

  7. Unikaj zakleszczenia.  Jest to już odpowiedzialność aplikacji po wybraniu synchronizacji, ale musi również uwzględnić udział WPF w synchronizacji. (Zobacz więcej, poniżej).

W zamian WPF zapewnia następujące zachowanie:

  • Uzyskuje CollectionView dostęp do kolekcji przez wywołanie zarejestrowanego CollectionSynchronizationCallback przy użyciu następujących argumentów:

    • collection: kolekcja zainteresowań.
    • context: zarejestrowany obiekt kontekstu.
    • accessMethod: delegat, który wykonuje rzeczywisty dostęp.
    • writeAccess: true jeśli delegat zmodyfikuje kolekcję; false w przeciwnym razie.

    Należy CollectionSynchronizationCallback ustanowić synchronizację w kolekcji (przy użyciu context obiektu i writeAccess wartości odpowiednio), wywołać metodę accessMethod, a następnie zwolnić synchronizację.

  • Obiekt CollectionView obsługuje "kopię w tle" kolekcji do użycia w wątku interfejsu użytkownika.

  • CollectionChanged zdarzenia są umieszczone w kolejce po nadejściu (w dowolnym wątku).

  • Oczekujące zdarzenia są stosowane do kopii w tle asynchronicznie w wątku interfejsu użytkownika, gdy ma możliwość wykonania tego zadania.

  • Narzędzie CollectionView nie będzie bezpośrednio używać żadnego innego mechanizmu synchronizacji widocznego dla aplikacji. Jest to sposób WPF na uniknięcie zakleszczenia (zobacz poprzedni element 7).  

Efekt netto polega na tym, że można zmienić kolekcję w dowolnym wątku, a te zmiany w końcu pojawią się w momencie ItemsControl , gdy wątek interfejsu użytkownika ma czas na "nadrobienie zaległości".  Implementacja została dostrojona, aby ograniczyć szybkość, która zmienia przepływ do wątku interfejsu użytkownika, aby zachować wątki w tle przed saturowaniem wątku interfejsu użytkownika i głodowaniem odpowiedzi na dane wejściowe normalnego użytkownika.

Parametr context jest dowolnym obiektem przekazywanym do obiektu callback. Można go użyć do określenia mechanizmu synchronizacji używanego do kontrolowania dostępu do collectionprogramu . Context może to być null.

Dotyczy