BindingOperations.EnableCollectionSynchronization Metoda
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
CollectionView Umožňuje objektu účastnit se synchronizovaného přístupu k kolekci, která se používá na více vláknech.
Přetížení
| Name | Description |
|---|---|
| EnableCollectionSynchronization(IEnumerable, Object) |
CollectionView Umožňuje objektu účastnit se synchronizovaného přístupu ke kolekci používané na více vláknech pomocí jednoduchého mechanismu uzamčení. |
| EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) |
CollectionView Umožňuje, aby se objekt zúčastnil synchronizovaného přístupu ke kolekci používané na více vláknech pomocí jiného mechanismu než jednoduchého zámku. |
Poznámky
Aplikace WPF (Windows Presentation Foundation) může zobrazit kolekci dat pomocí ItemsControl nebo jedné z jejích podtříd (ListBox, DataGrid, TreeView, ListView atd.). WPF (Windows Presentation Foundation) kanály veškerý přístup ke kolekci prostřednictvím podtřídy CollectionView. ItemsControl Spřažení s CollectionView vláknem, na kterém ItemsControl byl vytvořen, což znamená, že použití v jiném vlákně je zakázáno a vyvolá výjimku. Toto omezení platí i pro 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 v době, kdy probíhá shromažďování dat. V takové situaci zodpovídáte za zajištění synchronizovaného přístupu ("thread-safe") ke kolekci. Obvykle se to provádí pomocí jednoduchého mechanismu uzamčení nebo složitějšího synchronizačního mechanismu, jako jsou semafory, události resetování atd.
I když musíte synchronizovat přístup aplikace k kolekci, musíte také zaručit, že přístup z WPF (Windows Presentation Foundation) (konkrétně z CollectionView) se účastní stejného synchronizačního mechanismu. Provedete to voláním EnableCollectionSynchronization metody.
Pokud chcete použít kolekci na více vláknech, jedno z nich je vlákno uživatelského rozhraní, které vlastní ItemsControl, aplikace má následující odpovědnosti:
Zvolte synchronizační mechanismus.
Pomocí daného mechanismu synchronizujte veškerý přístup z aplikace do kolekce.
Zavolejte EnableCollectionSynchronization a informujte WPF (Windows Presentation Foundation) o mechanismu.
Volání musí nastat 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 objektu ItemsControl, podle toho, co je pozdější.
EnableCollectionSynchronization(IEnumerable, Object) Pokud použijete jednoduchý mechanismus zámku, zavolejte EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) přetížení, pokud používáte složitější mechanismus.
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. Zaručuje to například za předpokladu ObservableCollection<T> , že všechny změny jsou chráněné synchronizací.)
Pokud voláte , musí k volat DisableCollectionSynchronizationtaké ve vlákně uživatelského rozhraní.
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ě na každém vlákně uživatelského rozhraní.
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 WPF (Windows Presentation Foundation) účast v synchronizaci, jak je popsáno v následujícím odstavci.
Ve návratu WPF (Windows Presentation Foundation) poskytuje následující chování:
K CollectionView kolekci se přistupuje pomocí daného mechanismu synchronizace.
Udržuje CollectionView "stínovou kopii" kolekce pro použití ve vlákně uživatelského rozhraní.
CollectionChanged události se zařadí do fronty při jejich doručení (v libovolném vlákně).
Čekající události se použijí u stínové kopie asynchronně ve vlákně uživatelského rozhraní, pokud k tomu má příležitost.
Nebude CollectionView přímo používat žádný jiný synchronizační mechanismus viditelný pro aplikaci. To je WPF (Windows Presentation Foundation) způsob, jak se vyhnout vzájemnému zablokování (viz předchozí položka 7).
Čistý efekt spočívá v tom, že kolekci můžete změnit na libovolném vlákně a tyto změny se nakonec zobrazí v ItemsControl okamžiku, 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í zůstala nasycena vlákno uživatelského rozhraní a hladověla odpověď na normální uživatelský vstup.
EnableCollectionSynchronization(IEnumerable, Object)
CollectionView Umožňuje objektu účastnit se synchronizovaného přístupu ke kolekci používané na více vláknech pomocí jednoduchého mechanismu uzamčení.
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 k kolekci.
Poznámky
Aplikace WPF (Windows Presentation Foundation) může zobrazit kolekci dat pomocí ItemsControl nebo jedné z jejích podtříd (ListBox, DataGrid, TreeView, ListView atd.). WPF (Windows Presentation Foundation) kanály veškerý přístup ke kolekci prostřednictvím podtřídy CollectionView. ItemsControl Spřažení s CollectionView vláknem, na kterém ItemsControl byl vytvořen, což znamená, že použití v jiném vlákně je zakázáno a vyvolá výjimku. Toto omezení platí i pro 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 v době, kdy probíhá shromažďování dat. V takové situaci zodpovídáte za zajištění synchronizovaného přístupu ("thread-safe") ke kolekci a k zajištění, že se přístup z WPF (Windows Presentation Foundation) (konkrétně z CollectionView) účastní stejného mechanismu synchronizace. Voláním EnableCollectionSynchronization(IEnumerable, Object) metody to můžete provést pomocí jednoduchého mechanismu uzamčení.
Chcete-li použít kolekci na více vláknech, jedno z nich je vlákno uživatelského rozhraní, které vlastní ItemsControl, musíte provést následující:
Vytvořte instanci objektu, který se má uzamknout při přístupu k kolekci.
Synchronizujte veškerý přístup z aplikace do kolekce uzamčením objektu.
Voláním EnableCollectionSynchronization(IEnumerable, Object) informujte WPF (Windows Presentation Foundation), že používáte jednoduchý mechanismus uzamčení.
Volání musí nastat 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 objektu ItemsControl, podle toho, co je pozdější.
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. Zaručuje to například za předpokladu ObservableCollection<T> , že všechny změny jsou chráněné synchronizací.)
Pokud voláte , musí k volat DisableCollectionSynchronizationtaké ve vlákně uživatelského rozhraní.
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ě na každém vlákně uživatelského rozhraní.
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 WPF (Windows Presentation Foundation) účast v synchronizaci. (Další informace najdete níže.)
Ve návratu WPF (Windows Presentation Foundation) poskytuje následující chování:
K CollectionView kolekci se přistupuje pomocí mechanismu uzamčení.
Udržuje CollectionView "stínovou kopii" kolekce pro použití ve vlákně uživatelského rozhraní.
CollectionChanged události se zařadí do fronty při jejich doručení (v libovolném vlákně).
Čekající události se použijí u stínové kopie asynchronně ve vlákně uživatelského rozhraní, pokud k tomu má příležitost.
Nebude CollectionView přímo používat žádný jiný synchronizační mechanismus viditelný pro aplikaci. To je WPF (Windows Presentation Foundation) způsob, jak se vyhnout vzájemnému zablokování (viz předchozí položka 7).
Čistý efekt spočívá v tom, že kolekci můžete změnit na libovolném vlákně a tyto změny se nakonec zobrazí v ItemsControl okamžiku, 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í zůstala nasycena vlákno uživatelského rozhraní a hladověla odpověď na normální uživatelský vstup.
Platí pro
EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback)
CollectionView Umožňuje, aby se objekt zúčastnil synchronizovaného přístupu ke kolekci používané na 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 předaný zpětnému volání.
- synchronizationCallback
- CollectionSynchronizationCallback
Zpětné volání, které se vyvolá při každém přístupu k kolekci, je vyžadováno. Můžete ho použít k zajištění přístupu ke kolekci jedním vláknem najednou.
Poznámky
Aplikace WPF (Windows Presentation Foundation) může zobrazit kolekci dat pomocí ItemsControl nebo jedné z jejích podtříd (ListBox, DataGrid, TreeView, ListView atd.). WPF (Windows Presentation Foundation) kanály veškerý přístup ke kolekci prostřednictvím podtřídy CollectionView. ItemsControl Spřažení s CollectionView vláknem, na kterém ItemsControl byl vytvořen, což znamená, že použití v jiném vlákně je zakázáno a vyvolá výjimku. Toto omezení platí i pro 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 v době, kdy probíhá shromažďování dat. V takové situaci zodpovídáte za zajištění synchronizovaného přístupu ("thread-safe") ke kolekci a k zajištění, že se přístup z WPF (Windows Presentation Foundation) (konkrétně z CollectionView) účastní stejného mechanismu synchronizace. Voláním EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) metody to můžete provést pomocí synchronizačního mechanismu, jako jsou semafory, událost resetování atd.
Chcete-li použít kolekci na více vláknech, jedno z nich je vlákno uživatelského rozhraní, které vlastní ItemsControl, musíte provést následující:
Zvolte synchronizační mechanismus.
Pomocí daného mechanismu synchronizujte veškerý přístup z aplikace do kolekce.
Voláním přetížení EnableCollectionSynchronization(IEnumerable, Object, CollectionSynchronizationCallback) informujte WPF (Windows Presentation Foundation), že používáte jiný mechanismus než jednoduché uzamčení.
Volání musí nastat 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 objektu ItemsControl, podle toho, co je pozdější.
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. Zaručuje to například za předpokladu ObservableCollection<T> , že všechny změny jsou chráněné synchronizací.)
Pokud voláte , musí k volat DisableCollectionSynchronizationtaké ve vlákně uživatelského rozhraní.
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ě na každém vlákně uživatelského rozhraní.
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 WPF (Windows Presentation Foundation) účast v synchronizaci. (Další informace najdete níže.)
Ve návratu WPF (Windows Presentation Foundation) poskytuje následující chování:
K CollectionView kolekci se přistupuje voláním registrovaného CollectionSynchronizationCallback s následujícími argumenty:
-
collection: kolekce zájmů. -
context: registrovaný kontextový objekt. -
accessMethod: delegát, který provádí skutečný přístup. -
writeAccess:truePokud delegát upraví kolekci,falsejinak.
Měli byste CollectionSynchronizationCallback vytvořit synchronizaci v kolekci (pomocí objektu
contextwriteAccessa hodnoty podle potřeby), zavolejteaccessMethoda pak uvolněte synchronizaci.-
Udržuje CollectionView "stínovou kopii" kolekce pro použití ve vlákně uživatelského rozhraní.
CollectionChanged události se zařadí do fronty při jejich doručení (v libovolném vlákně).
Čekající události se použijí u stínové kopie asynchronně ve vlákně uživatelského rozhraní, pokud k tomu má příležitost.
Nebude CollectionView přímo používat žádný jiný synchronizační mechanismus viditelný pro aplikaci. To je WPF (Windows Presentation Foundation) způsob, jak se vyhnout vzájemnému zablokování (viz předchozí položka 7).
Čistý efekt spočívá v tom, že kolekci můžete změnit na libovolném vlákně a tyto změny se nakonec zobrazí v ItemsControl okamžiku, 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í zůstala nasycena vlákno uživatelského rozhraní a hladověla odpověď 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í synchronizačního mechanismu, který slouží k řízení přístupu k collection.
Context může být null.