BindingOperations.EnableCollectionSynchronization Metoda

Definice

Umožňuje objektu CollectionView účastnit se synchronizovaného přístupu ke kolekci, která se používá ve více vláknech.

Přetížení

EnableCollectionSynchronization(IEnumerable, Object)

Umožňuje objektu CollectionView účastnit se synchronizovaného přístupu ke kolekci používané na více vláknech pomocí jednoduchého zamykacího mechanismu.

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Umožňuje objektu CollectionView účastnit se synchronizovaného přístupu ke kolekci používané ve více vláknech pomocí jiného mechanismu než jednoduchého zámku.

Poznámky

Aplikace WPF může zobrazit kolekci dat pomocí ItemsControl některé nebo jedné z jejích podtříd (ListBox, DataGrid, TreeView, ListViewatd.). WPF kanáluje veškerý přístup ke kolekci prostřednictvím podtřídy CollectionViewItemsControl Obě a CollectionView mají spřažení s vláknem, na kterém ItemsControl byl vytvořen, což znamená, že jejich použití v jiném vlákně je zakázáno a vyvolá výjimku. Toto omezení se v podstatě vztahuje i na kolekci.

Kolekci můžete chtít použít na více vláknech.   Například chcete aktualizovat kolekci (přidat nebo odebrat položky) ve vlákně "shromažďování dat" a současně zobrazit výsledky ve vlákně "uživatelského rozhraní", aby uživatelské rozhraní zůstalo responzivní, zatímco probíhá shromažďování dat. V takové situaci zodpovídáte za zajištění synchronizovaného přístupu ke kolekci (bezpečný z více vláken).   To se obvykle provádí pomocí jednoduchého mechanismu zámku nebo složitějšího synchronizačního mechanismu, jako jsou semafory, události resetování atd.

I když musíte synchronizovat přístup vaší aplikace ke kolekci, musíte také zaručit, že přístup z WPF (konkrétně z CollectionView) bude součástí stejného synchronizačního mechanismu.  Provedete to voláním EnableCollectionSynchronization metody .

Chcete-li použít kolekci ve více vláknech, z nichž jedním je vlákno uživatelského rozhraní, které vlastní ItemsControl, má aplikace následující povinnosti:

  1. Zvolte mechanismus synchronizace.

  2. Synchronizujte veškerý přístup z aplikace do kolekce pomocí daného mechanismu.

  3. Zavolejte EnableCollectionSynchronization a informujte WPF o mechanismu.

  4. Ujistěte se, že změna kolekce a oznámení o této změně (prostřednictvím INotifyCollectionChanged) jsou atomické. Žádný přístup z jiných vláken nemůže zasahovat.  (Obvykle je to zdarma. Například to zaručuje za předpokladu ObservableCollection<T> , že všechny změny jsou chráněny synchronizací.)

  5. Pokud zavoláte DisableCollectionSynchronization, musí toto volání proběhnout také ve vlákně uživatelského rozhraní.

  6. Pokud chcete použít stejnou kolekci na více vláknech uživatelského rozhraní, musíte volat EnableCollectionSynchronization (a DisableCollectionSynchronizationv případě potřeby) samostatně v každém vlákně uživatelského rozhraní.

  7. Vyhněte se vzájemnému zablokování.  To je již odpovědností aplikace, jakmile se rozhodne použít synchronizaci, ale musí také vzít v úvahu účast WPF na synchronizaci, jak je popsáno v následujícím odstavci.

WpF na oplátku poskytuje následující chování:

  • Objekt CollectionView přistupuje ke kolekci pomocí daného synchronizačního mechanismu.

  • Nástroj CollectionView udržuje "stínovou kopii" kolekce pro použití ve vlákně uživatelského rozhraní.

  • CollectionChanged události jsou zařazeny do fronty, jakmile dorazí (v libovolném vlákně).

  • Čekající události se použijí na stínové kopie asynchronně ve vlákně uživatelského rozhraní, pokud k tomu má možnost.

  • Nástroj CollectionView nebude přímo používat žádný jiný synchronizační mechanismus viditelný pro aplikaci. Toto je způsob, jak WPF zabránit vzájemnému zablokování (viz předchozí bod 7).  

Čistý efekt spočívá v tom, že můžete změnit kolekci v libovolném vlákně a tyto změny se nakonec zobrazí v případě ItemsControl , že má vlákno uživatelského rozhraní čas na "dohánět".  Implementace byla vyladěna tak, aby omezila rychlost změn toku do vlákna uživatelského rozhraní, aby vlákna na pozadí nemohla nasytit vlákno uživatelského rozhraní a vyhladověla odpověď na normální uživatelský vstup.

EnableCollectionSynchronization(IEnumerable, Object)

Umožňuje objektu CollectionView účastnit se synchronizovaného přístupu ke kolekci používané na více vláknech pomocí jednoduchého zamykacího mechanismu.

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

Kolekce, která potřebuje synchronizovaný přístup.

lockObject
Object

Objekt, který se má uzamknout při přístupu ke kolekci.

Poznámky

Aplikace WPF může zobrazit kolekci dat pomocí ItemsControl některé nebo jedné z jejích podtříd (ListBox, DataGrid, TreeView, ListViewatd.). WPF kanáluje veškerý přístup ke kolekci prostřednictvím podtřídy CollectionViewItemsControl Obě a CollectionView mají spřažení s vláknem, na kterém ItemsControl byl vytvořen, což znamená, že jejich použití v jiném vlákně je zakázáno a vyvolá výjimku. Toto omezení se v podstatě vztahuje i na kolekci.

Kolekci můžete chtít použít na více vláknech.   Například chcete aktualizovat kolekci (přidat nebo odebrat položky) ve vlákně "shromažďování dat" a současně zobrazit výsledky ve vlákně "uživatelského rozhraní", aby uživatelské rozhraní zůstalo responzivní, zatímco probíhá shromažďování dat. V takové situaci zodpovídáte za zajištění synchronizovaného přístupu ke kolekci ("bezpečný pro přístup z více vláken") a za zaručení, že přístup z WPF (konkrétně z CollectionView) bude součástí stejného synchronizačního mechanismu. Voláním EnableCollectionSynchronization(IEnumerable, Object) metody to můžete provést pomocí jednoduchého mechanismu zámku.

Chcete-li použít kolekci ve více vláknech, z nichž jedno je vlákno uživatelského rozhraní, které vlastní ItemsControl, musíte provést následující kroky:

  1. Vytvořte instanci objektu, který se má uzamknout při přístupu ke kolekci.

  2. Synchronizujte veškerý přístup z aplikace do kolekce uzamčením daného objektu.

  3. Zavolejte EnableCollectionSynchronization(IEnumerable, Object) a informujte WPF, že používáte jednoduchý zamykací mechanismus.

    • Volání musí proběhnout ve vlákně uživatelského rozhraní.

    • Volání musí proběhnout před použitím kolekce v jiném vlákně nebo před připojením kolekce k ItemsControl, podle toho, co nastane později.

  4. Ujistěte se, že změna kolekce a oznámení o této změně (prostřednictvím INotifyCollectionChanged) jsou atomické. Žádný přístup z jiných vláken nemůže zasahovat.  (Obvykle je zdarma. Například to zaručuje za předpokladu ObservableCollection<T> , že všechny změny jsou chráněny synchronizací.)

  5. Pokud zavoláte DisableCollectionSynchronization, musí toto volání proběhnout také ve vlákně uživatelského rozhraní.

  6. Pokud chcete použít stejnou kolekci na více vláknech uživatelského rozhraní, musíte volat EnableCollectionSynchronization (a DisableCollectionSynchronizationv případě potřeby) samostatně v každém vlákně uživatelského rozhraní.

  7. Vyhněte se vzájemnému zablokování.  To už je zodpovědností aplikace, jakmile se rozhodne použít synchronizaci, ale musí také vzít v úvahu účast WPF na synchronizaci. (Další informace najdete níže.)

Na oplátku WPF poskytuje následující chování:

  • Objekt CollectionView přistupuje ke kolekci pomocí zamykacího mechanismu.

  • Objekt CollectionView udržuje "stínovou kopii" kolekce pro použití ve vlákně uživatelského rozhraní.

  • CollectionChanged události se zadají do fronty při přijetí (v libovolném vlákně).

  • Čekající události se použijí na stínové kopii asynchronně ve vlákně uživatelského rozhraní, pokud k tomu má možnost.

  • Nebude CollectionView přímo používat žádný jiný synchronizační mechanismus viditelný pro aplikaci. Toto je způsob, jak WPF pomoct vyhnout se vzájemnému zablokování (viz předchozí položka 7).  

Čistý efekt spočívá v tom, že můžete změnit kolekci na libovolném vlákně a tyto změny se nakonec zobrazí v, ItemsControl když má vlákno uživatelského rozhraní čas "dohnat".  Implementace byla vyladěna tak, aby omezila rychlost, která se mění do vlákna uživatelského rozhraní, aby vlákna na pozadí zabránila nasycení vlákna uživatelského rozhraní a vyhladovění odpovědi na normální uživatelský vstup.

Platí pro

EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)

Umožňuje objektu CollectionView účastnit se synchronizovaného přístupu ke kolekci používané ve více vláknech pomocí jiného mechanismu než jednoduchého zámku.

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

Kolekce, která potřebuje synchronizovaný přístup.

context
Object

Objekt, který je předán zpětnému volání.

synchronizationCallback
CollectionSynchronizationCallback

Zpětné volání, které je vyvoláno vždy, když se vyžaduje přístup ke kolekci. Můžete ho použít k zajištění přístupu ke kolekci prostřednictvím jednoho vlákna najednou.

Poznámky

Aplikace WPF může zobrazit kolekci dat pomocí ItemsControl některé nebo jedné z jejích podtříd (ListBox, DataGrid, TreeView, ListViewatd.). WPF kanáluje veškerý přístup ke kolekci prostřednictvím podtřídy CollectionViewItemsControl Obě a CollectionView mají spřažení s vláknem, na kterém ItemsControl byl vytvořen, což znamená, že jejich použití v jiném vlákně je zakázáno a vyvolá výjimku. Toto omezení se v podstatě vztahuje i na kolekci.

Kolekci můžete chtít použít na více vláknech.   Například chcete aktualizovat kolekci (přidat nebo odebrat položky) ve vlákně "shromažďování dat" a současně zobrazit výsledky ve vlákně "uživatelského rozhraní", aby uživatelské rozhraní zůstalo responzivní, zatímco probíhá shromažďování dat. V takové situaci zodpovídáte za zajištění synchronizovaného přístupu ke kolekci ("bezpečný pro přístup z více vláken") a za zaručení, že přístup z WPF (konkrétně z CollectionView) bude součástí stejného synchronizačního mechanismu. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) Voláním metody to můžete provést pomocí synchronizačního mechanismu, jako jsou semafory, událost resetování atd.

Chcete-li použít kolekci ve více vláknech, z nichž jedno je vlákno uživatelského rozhraní, které vlastní ItemsControl, musíte provést následující kroky:

  1. Zvolte mechanismus synchronizace.

  2. Synchronizujte veškerý přístup z aplikace do kolekce pomocí daného mechanismu.

  3. EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) Volání přetížení informovat WPF, že používáte jiný mechanismus než jednoduché uzamčení.

    • Volání musí proběhnout ve vlákně uživatelského rozhraní.

    • Volání musí proběhnout před použitím kolekce v jiném vlákně nebo před připojením kolekce k ItemsControl, podle toho, co nastane později.

  4. Ujistěte se, že změna kolekce a oznámení o této změně (prostřednictvím INotifyCollectionChanged) jsou atomické. Žádný přístup z jiných vláken nemůže zasahovat.  (Obvykle je zdarma. Například to zaručuje za předpokladu ObservableCollection<T> , že všechny změny jsou chráněny synchronizací.)

  5. Pokud zavoláte DisableCollectionSynchronization, musí toto volání proběhnout také ve vlákně uživatelského rozhraní.

  6. Pokud chcete použít stejnou kolekci na více vláknech uživatelského rozhraní, musíte volat EnableCollectionSynchronization (a DisableCollectionSynchronizationv případě potřeby) samostatně v každém vlákně uživatelského rozhraní.

  7. Vyhněte se vzájemnému zablokování.  To už je zodpovědností aplikace, jakmile se rozhodne použít synchronizaci, ale musí také vzít v úvahu účast WPF na synchronizaci. (Další informace najdete níže.)

Na oplátku WPF poskytuje následující chování:

  • Objekt CollectionView přistupuje ke kolekci voláním registrovaného CollectionSynchronizationCallback s následujícími argumenty:

    • collection: kolekce zájmu.
    • context: zaregistrovaný objekt kontextu.
    • accessMethod: delegát, který provádí skutečný přístup.
    • writeAccess: true pokud delegát změní kolekci, false jinak.

    Měli byste CollectionSynchronizationCallback navázat synchronizaci kolekce (pomocí objektu context a writeAccess hodnoty podle potřeby), volat accessMethoda pak uvolnit synchronizaci.

  • Objekt CollectionView udržuje "stínovou kopii" kolekce pro použití ve vlákně uživatelského rozhraní.

  • CollectionChanged události se zadají do fronty při přijetí (v libovolném vlákně).

  • Čekající události se použijí na stínové kopii asynchronně ve vlákně uživatelského rozhraní, pokud k tomu má možnost.

  • Nebude CollectionView přímo používat žádný jiný synchronizační mechanismus viditelný pro aplikaci. Toto je způsob, jak WPF pomoct vyhnout se vzájemnému zablokování (viz předchozí položka 7).  

Čistý efekt spočívá v tom, že můžete změnit kolekci na libovolném vlákně a tyto změny se nakonec zobrazí v, ItemsControl když má vlákno uživatelského rozhraní čas "dohnat".  Implementace byla vyladěna tak, aby omezila rychlost, která se mění do vlákna uživatelského rozhraní, aby vlákna na pozadí zabránila nasycení vlákna uživatelského rozhraní a vyhladovění odpovědi na normální uživatelský vstup.

Parametr context je libovolný objekt, který se předává do objektu callback. Můžete ho použít k určení mechanismu synchronizace používaného k řízení přístupu k collection. Context může být null.

Platí pro