Sdílet prostřednictvím


LazyThreadSafetyMode Výčet

Definice

Určuje, jak Lazy<T> instance synchronizuje přístup mezi více vlákny.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Dědičnost
LazyThreadSafetyMode

Pole

ExecutionAndPublication 2

Zámky slouží k zajištění toho, aby instanci inicializovalo Lazy<T> pouze jedno vlákno bezpečným způsobem. Metoda inicializace se efektivně provádí bezpečným způsobem s vlákny (označované jako Execution v názvu pole). Publication inicializovaná hodnota je také bezpečná pro vlákno v tom smyslu, že je možné publikovat a používat pouze jednu hodnotu pro všechna vlákna. Pokud inicializační metoda (nebo konstruktor bez parametrů, pokud neexistuje žádná inicializační metoda) používá zámky interně, může dojít k zablokování. Pokud použijete Lazy<T> konstruktor, který určuje inicializační metodu (valueFactory parametr) a pokud tato inicializační metoda vyvolá výjimku (nebo se nepodaří zpracovat výjimku) při prvním volání Value vlastnosti, pak je výjimka uložena do mezipaměti a vyvolána znovu při následných voláních vlastnosti Value . Pokud použijete Lazy<T> konstruktor, který nezadává inicializační metodu, výjimky, které vyvolá konstruktor bez parametrů, T nejsou uloženy do mezipaměti. V takovém případě může následné volání Value vlastnosti úspěšně inicializovat Lazy<T> instanci. Pokud metoda inicializace rekurzivně přistupuje k Value vlastnosti Lazy<T> instance, vyvolá se vyvolá InvalidOperationException .

None 0

Instance Lazy<T> není bezpečná pro vlákno. Pokud je instance přístupná z více vláken, jeho chování není definováno. Tento režim používejte pouze v případě, že je zásadní vysoký výkon a Lazy<T> instance se nikdy neicializuje z více než jednoho vlákna. Pokud použijete Lazy<T> konstruktor, který určuje inicializační metodu (valueFactory parametr) a pokud tato inicializační metoda vyvolá výjimku (nebo se nepodaří zpracovat výjimku) při prvním volání Value vlastnosti, pak je výjimka uložena do mezipaměti a vyvolána znovu při následných voláních vlastnosti Value . Pokud použijete Lazy<T> konstruktor, který nezadává inicializační metodu, výjimky, které vyvolá konstruktor bez parametrů, T nejsou uloženy do mezipaměti. V takovém případě může následné volání Value vlastnosti úspěšně inicializovat Lazy<T> instanci. Pokud metoda inicializace rekurzivně přistupuje k Value vlastnosti Lazy<T> instance, vyvolá se vyvolá InvalidOperationException .

PublicationOnly 1

Pokud se několik vláken pokusí inicializovat Lazy<T> instanci současně, všechna vlákna mohou spustit inicializační metodu (nebo konstruktor bez parametrů, pokud neexistuje žádná inicializační metoda). První vlákno k dokončení inicializace nastaví hodnotu Lazy<T> instance. To se označuje jako Publication v názvech polí. Tato hodnota se vrátí do jiných vláken, která byla současně spuštěna inicializační metoda, pokud metoda inicializace nevyvolá výjimky v těchto vláknech. Všechny instance T vytvořené konkurenčními vlákny se zahodí. Publikace inicializované hodnoty je v podstatě bezpečná pro vlákno v tom smyslu, že všechny vlákna mohou publikovat a používat pouze jednu z inicializovaných hodnot. Pokud inicializační metoda vyvolá výjimku v libovolném vlákně, výjimka se rozšíří z Value vlastnosti v daném vlákně. Výjimka není uložena v mezipaměti. Hodnota IsValueCreated vlastnosti zůstává falsea následné volání Value vlastnosti, a to buď vláknem, kde byla výjimka vyvolán, nebo jinými vlákny, způsobí, že inicializační metoda se spustí znovu. Pokud metoda inicializace rekurzivně přistupuje k Value vlastnosti Lazy<T> instance, není vyvolán žádná výjimka.

Poznámky

Tento výčet použijte k určení mode parametru konstruktorů Lazy<T> . Účinky všech konstruktorů na synchronizaci vláken lze popsat z hlediska tohoto výčtu bez ohledu na to, zda mají mode parametry.

Lazy<T> Instance je inicializována buď metodou inicializace určenou uživatelem, nebo konstruktorem bez parametrů pro T. Inicializační metoda je určena valueFactory parametrem konstruktoru Lazy<T> . Metoda vrátí instanci T, což je typ, který je lazily instance instance .Lazy<T> Pokud konstruktor nemá valueFactory parametr, použije se konstruktor bez parametrů k T inicializaci Lazy<T> instance. V jiném případě inicializace nastane při prvním volání Lazy<T>.Value vlastnosti.

Kromě určení bezpečnosti Lazy<T> vlákna instance má tento výčet vliv na ukládání výjimek do mezipaměti. Pokud jsou výjimky uložené v mezipaměti pro Lazy<T> instanci, získáte jen jednu šanci inicializovat instanci. Pokud se při prvním volání Lazy<T>.Value vlastnosti vyvolá výjimka, tato výjimka se ukládá do mezipaměti a opakuje se při všech následných voláních vlastnosti Lazy<T>.Value . Výhodou výjimek ukládání do mezipaměti je, že každé dvě vlákna vždy získají stejný výsledek, i když dojde k chybám.

Když zadáte režim PublicationOnly, výjimky se nikdy neukládají do mezipaměti. Když zadáte None nebo ExecutionAndPublication, ukládání do mezipaměti závisí na tom, jestli zadáte inicializační metodu nebo povolíte použití konstruktoru T bez parametrů. Určení metody inicializace umožňuje ukládání výjimek do mezipaměti pro tyto dva režimy. Inicializační metoda může být velmi jednoduchá. Může například volat konstruktor bez parametrů pro T: new Lazy<Contents>(() => new Contents(), mode) v jazyce C# nebo New Lazy(Of Contents)(Function() New Contents()) v Visual Basic. Pokud použijete konstruktor, který nezadává inicializační metodu, výjimky, které vyvolá konstruktor bez parametrů, T nejsou uloženy do mezipaměti. Následující tabulka shrnuje chování ukládání výjimek do mezipaměti.

Režim Použití metody inicializace Použití konstruktoru bez parametrů pro T
Žádné V mezipaměti Není uložená v mezipaměti
PublicationOnly Není uložená v mezipaměti Není uložená v mezipaměti
ExecutionAndPublication V mezipaměti Není uložená v mezipaměti

Platí pro

Viz také