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

Name Hodnota Description
None 0

Instance Lazy<T> není bezpečná pro přístup z více vláken. Pokud je instance přístupná z více vláken, jeho chování není definováno. Tento režim použijte pouze v případě, že je vysoký výkon zásadní a Lazy<T> instance je zaručená, že se nikdy neinicializuje 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 Value vlastnosti. Pokud použijete konstruktor Lazy<T>, který neurčí inicializační metodu, výjimky vyvolané bezparametrovým konstruktorem pro 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 více 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í. Publikování inicializované hodnoty je v podstatě bezpečné pro přístup z více vláken v tom smyslu, že lze 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šíří mimo Value vlastnost v daném vlákně. Výjimka není uložena v mezipaměti. Hodnota IsValueCreated vlastnosti zůstává falsea následné volání vlastnosti Value , buď vláknem, kde byla výjimka vyvolán, nebo jinými vlákny, způsobí, že inicializační metoda znovu spustí. Pokud metoda inicializace rekurzivně přistupuje k Value vlastnosti Lazy<T> instance, není vyvolán žádná výjimka.

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 v podstatě provádí bezpečným způsobem s vlákny (označované jako Execution v názvu pole). Publication inicializované hodnoty je také 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 Value vlastnosti. Pokud použijete konstruktor Lazy<T>, který neurčí inicializační metodu, výjimky vyvolané bezparametrovým konstruktorem pro 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 .

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, ať už mají mode parametry nebo ne.

Instance Lazy<T> je inicializována buď metodou inicializace zadanou 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 k inicializaci Lazy<T> instance konstruktor T bez parametrů. V obou případech dojde k inicializaci při prvním volání Lazy<T>.Value vlastnosti.

Kromě určení zabezpečení Lazy<T> vlákna instance má tento výčet vliv na ukládání výjimek do mezipaměti. Pokud jsou výjimky pro instanci Lazy<T> uloženy v mezipaměti, získáte pouze jednu šanci inicializovat instanci. Pokud dojde k vyvolání výjimky při prvním volání Lazy<T>.Value vlastnosti, tato výjimka je uložena do mezipaměti a znovu vyvolán 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, zda zadáte inicializační metodu nebo povolíte použití konstruktoru T bez parametrů. Zadání metody inicializace umožňuje ukládání výjimek do mezipaměti pro tyto dva režimy. Metoda inicializace 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 jazyce Visual Basic. Pokud použijete konstruktor, který neurčí inicializační metodu, výjimky vyvolané konstruktorem bez parametrů nejsou T uloženy do mezipaměti. Následující tabulka shrnuje chování ukládání výjimek do mezipaměti.

Mode Použití metody inicializace Použití konstruktoru bez parametrů pro T
None Mezipaměti Neul.
PublikaceOnly Neul. Neul.
ExecutionAndPublication Mezipaměti Neul.

Platí pro

Viz také