LazyThreadSafetyMode Wyliczenie
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Określa, w jaki sposób Lazy<T> wystąpienie synchronizuje dostęp między wieloma wątkami.
public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode =
Public Enum LazyThreadSafetyMode
- Dziedziczenie
Pola
ExecutionAndPublication | 2 | Blokady są używane w celu zapewnienia, że tylko jeden wątek może zainicjować Lazy<T> wystąpienie w bezpieczny wątkowo sposób. W praktyce metoda inicjowania jest wykonywana w bezpieczny wątkowo sposób (określany jako |
None | 0 | Wystąpienie nie jest bezpieczne wątkiem. Jeśli Lazy<T> wystąpienie jest dostępne z wielu wątków, jego zachowanie jest niezdefiniowane. Tego trybu należy używać tylko wtedy, gdy wysoka wydajność ma kluczowe znaczenie, a Lazy<T> wystąpienie nigdy nie zostanie zainicjowane z więcej niż jednego wątku. Jeśli używasz konstruktora Lazy<T> , który określa metodę inicjowania ( |
PublicationOnly | 1 | Gdy wiele wątków próbuje zainicjować Lazy<T> wystąpienie jednocześnie, wszystkie wątki mogą uruchamiać metodę inicjowania (lub konstruktor bez parametrów, jeśli nie ma metody inicjowania). Pierwszy wątek do ukończenia inicjowania ustawia wartość Lazy<T> wystąpienia. Jest to określane jako |
Uwagi
Użyj tego wyliczenia, aby określić mode
parametr konstruktorów Lazy<T> . Wpływ wszystkich konstruktorów na synchronizację wątków można opisać pod względem tego wyliczenia, niezależnie od tego, czy mają mode
parametry.
Lazy<T> Wystąpienie jest inicjowane przez metodę inicjowania określoną przez użytkownika lub przez konstruktor bez parametrów dla elementu T
. Metoda inicjowania jest określana przez valueFactory
parametr konstruktora Lazy<T> . Metoda zwraca wystąpienie T
klasy , czyli typ, który jest leniwie tworzone przez wystąpienie klasy Lazy<T>. Jeśli konstruktor nie ma parametru valueFactory
, konstruktor bez parametrów jest T
używany do inicjowania Lazy<T> wystąpienia. W obu przypadkach inicjowanie następuje przy pierwszym wywołaniu Lazy<T>.Value właściwości.
Oprócz określania bezpieczeństwa wątków Lazy<T> wystąpienia, to wyliczenie ma wpływ na buforowanie wyjątków. Gdy wyjątki są buforowane dla Lazy<T> wystąpienia, można uzyskać tylko jedną szansę na zainicjowanie wystąpienia. Jeśli wyjątek jest zgłaszany przy pierwszym wywołaniu Lazy<T>.Value właściwości, ten wyjątek jest buforowany i ponownie wprowadzany we wszystkich kolejnych wywołaniach do Lazy<T>.Value właściwości. Zaletą buforowania wyjątków jest to, że każdy dwa wątki zawsze otrzymują ten sam wynik, nawet jeśli wystąpią błędy.
Po określeniu trybu PublikacjaOnly wyjątki nigdy nie są buforowane. Po określeniu wartości None lub ExecutionAndPublication buforowanie zależy od tego, czy określisz metodę inicjowania, czy zezwolisz na użycie konstruktora bez parametrów T
. Określenie metody inicjowania umożliwia buforowanie wyjątków dla tych dwóch trybów. Metoda inicjowania może być bardzo prosta. Na przykład może wywołać konstruktor bez parametrów dla T
new Lazy<Contents>(() => new Contents(), mode)
: w języku C# lub New Lazy(Of Contents)(Function() New Contents())
w Visual Basic. Jeśli używasz konstruktora, który nie określa metody inicjowania, wyjątki zgłaszane przez konstruktora bez parametrów nie T
są buforowane. Poniższa tabela zawiera podsumowanie zachowania buforowania wyjątków.
Tryb | Używanie metody inicjowania | Używanie konstruktora bez parametrów dla T |
---|---|---|
Brak | W pamięci podręcznej | Niebuforowane |
PublikacjaOnly | Niebuforowane | Niebuforowane |
ExecutionAndPublication | W pamięci podręcznej | Niebuforowane |