Udostępnij za pośrednictwem


LazyThreadSafetyMode Wyliczenie

Definicja

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
LazyThreadSafetyMode

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 Execution w nazwie pola). Publication początkowa wartość jest również bezpieczna wątkowo w tym sensie, że tylko jedna wartość może być opublikowana i używana przez wszystkie wątki. Jeśli metoda inicjowania (lub konstruktor bez parametrów, jeśli nie ma metody inicjowania) używa blokad wewnętrznie, mogą wystąpić zakleszczenia. Jeśli używasz konstruktora Lazy<T> , który określa metodę inicjowania (valueFactory parametr), a jeśli ta metoda inicjowania zgłasza wyjątek (lub nie obsługuje wyjątku) przy pierwszym wywołaniu Value właściwości, wyjątek jest buforowany i zgłaszany ponownie przy kolejnych wywołaniach do Value właściwości. Jeśli używasz konstruktora Lazy<T> , który nie określa metody inicjowania, wyjątki zgłaszane przez konstruktora bez parametrów nie T są buforowane. W takim przypadku kolejne wywołanie Value właściwości może pomyślnie zainicjować Lazy<T> wystąpienie. Jeśli metoda inicjowania rekursywnie uzyskuje Value dostęp do właściwości Lazy<T> wystąpienia, InvalidOperationException jest zgłaszana wartość .

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 (valueFactory parametr), a jeśli ta metoda inicjowania zgłasza wyjątek (lub nie obsługuje wyjątku) przy pierwszym wywołaniu Value właściwości, wyjątek jest buforowany i zgłaszany ponownie przy kolejnych wywołaniach do Value właściwości. Jeśli używasz konstruktora Lazy<T> , który nie określa metody inicjowania, wyjątki zgłaszane przez konstruktora bez parametrów nie T są buforowane. W takim przypadku kolejne wywołanie Value właściwości może pomyślnie zainicjować Lazy<T> wystąpienie. Jeśli metoda inicjowania rekursywnie uzyskuje Value dostęp do właściwości Lazy<T> wystąpienia, InvalidOperationException jest zgłaszana wartość .

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 Publication w nazwach pól. Ta wartość jest zwracana do innych wątków, które jednocześnie uruchamiały metodę inicjowania, chyba że metoda inicjowania zgłasza wyjątki w tych wątkach. Wszystkie wystąpienia T , które zostały utworzone przez konkurencyjne wątki, są odrzucane. W rzeczywistości publikacja zainicjowanej wartości jest bezpieczna wątkowo w sensie, że tylko jedna z zainicjowanych wartości może być opublikowana i używana przez wszystkie wątki. Jeśli metoda inicjowania zgłasza wyjątek dla dowolnego wątku, wyjątek jest propagowany z Value właściwości w tym wątku. Wyjątek nie jest buforowany. Wartość IsValueCreated właściwości pozostaje falsewartością , a kolejne wywołania Value właściwości przez wątek, w którym został zgłoszony wyjątek, lub przez inne wątki, powodują ponowne uruchomienie metody inicjowania. Jeśli metoda inicjowania rekursywnie uzyskuje dostęp do Value właściwości Lazy<T> wystąpienia, nie jest zgłaszany wyjątek.

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 Tklasy , 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 Tnew 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

Dotyczy

Zobacz też