LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode LazyThreadSafetyMode Enum

Definition

Gibt an, wie eine Lazy<T>-Instanz den Zugriff bei mehreren Threads synchronisiert.Specifies how a Lazy<T> instance synchronizes access among multiple threads.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Vererbung
LazyThreadSafetyModeLazyThreadSafetyModeLazyThreadSafetyModeLazyThreadSafetyMode

Felder

ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication ExecutionAndPublication 2

Sperren werden dazu verwendet, um sicherzustellen, dass eine Lazy<T>-Instanz nur von einem einzelner Thread auf threadsichere Weise initialisiert werden kann.Locks are used to ensure that only a single thread can initialize a Lazy<T> instance in a thread-safe manner. Wenn die Initialisierungsmethode (oder der parameterlose Konstruktor, wenn keine Initialisierungsmethode vorhanden ist) die Sperren intern verwendet, können Deadlocks auftreten.If the initialization method (or the parameterless constructor, if there is no initialization method) uses locks internally, deadlocks can occur. Wenn Sie einen Lazy<T>-Konstruktor verwenden, der eine Initialisierungsmethode angibt (valueFactory-Parameter), und wenn diese Initialisierungsmethode zudem eine Ausnahme auslöst (oder bei der Behandlung einer Ausnahme ein Fehler auftritt), wenn die Value-Eigenschaft das erste Mal aufgerufen wird, dann wird die Ausnahme zwischengespeichert und bei nachfolgenden Aufrufen der Value-Eigenschaft erneut ausgelöst.If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. Wenn Sie einen Lazy<T>-Konstruktor verwenden, der keine Initialisierungsmethode angibt, werden vom parameterlosen Konstruktor für T ausgelöste Ausnahmen nicht zwischengespeichert.If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. In diesem Fall kann ein nachfolgender Aufruf der Value-Eigenschaft die Lazy<T>-Instanz möglicherweise erfolgreich initialisieren.In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. Wenn die Initialisierungsmethode rekursiv auf die Value-Eigenschaft der Lazy<T>-Instanz zugreift, wird eine InvalidOperationException ausgelöst.If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

None None None None 0

Die Lazy<T>-Instanz ist nicht threadsicher. Wenn mehrere Threads auf die Instanz zugreifen, ist das Verhalten nicht definiert.The Lazy<T> instance is not thread safe; if the instance is accessed from multiple threads, its behavior is undefined. Verwenden Sie diesen Modus nur, wenn hohe Leistungsfähigkeit entscheidend ist und die Lazy<T>-Instanz garantiert nie von mehr als einem Thread initialisiert wird.Use this mode only when high performance is crucial and the Lazy<T> instance is guaranteed never to be initialized from more than one thread. Wenn Sie einen Lazy<T>-Konstruktor verwenden, der eine Initialisierungsmethode angibt (valueFactory-Parameter), und wenn diese Initialisierungsmethode zudem eine Ausnahme auslöst (oder bei der Behandlung einer Ausnahme ein Fehler auftritt), wenn die Value-Eigenschaft das erste Mal aufgerufen wird, dann wird die Ausnahme zwischengespeichert und bei nachfolgenden Aufrufen der Value-Eigenschaft erneut ausgelöst.If you use a Lazy<T> constructor that specifies an initialization method (valueFactory parameter), and if that initialization method throws an exception (or fails to handle an exception) the first time you call the Value property, then the exception is cached and thrown again on subsequent calls to the Value property. Wenn Sie einen Lazy<T>-Konstruktor verwenden, der keine Initialisierungsmethode angibt, werden vom parameterlosen Konstruktor für T ausgelöste Ausnahmen nicht zwischengespeichert.If you use a Lazy<T> constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. In diesem Fall kann ein nachfolgender Aufruf der Value-Eigenschaft die Lazy<T>-Instanz möglicherweise erfolgreich initialisieren.In that case, a subsequent call to the Value property might successfully initialize the Lazy<T> instance. Wenn die Initialisierungsmethode rekursiv auf die Value-Eigenschaft der Lazy<T>-Instanz zugreift, wird eine InvalidOperationException ausgelöst.If the initialization method recursively accesses the Value property of the Lazy<T> instance, an InvalidOperationException is thrown.

PublicationOnly PublicationOnly PublicationOnly PublicationOnly 1

Wenn mehrere Threads gleichzeitig versuchen, eine Lazy<T>-Instanz zu initialisieren, dürfen alle Threads die Initialisierungsmethode (oder den parameterlosen Konstruktor, wenn keine Initialisierungsmethode vorhanden ist) ausführen.When multiple threads try to initialize a Lazy<T> instance simultaneously, all threads are allowed to run the initialization method (or the parameterless constructor, if there is no initialization method). Der erste Thread, der die Initialisierung abgeschlossen hat, legt den Wert der Lazy<T>-Instanz fest.The first thread to complete initialization sets the value of the Lazy<T> instance. Dieser Wert wird an alle anderen Threads zurückgegeben, die die Initialisierungsmethode gleichzeitig ausgeführt haben, sofern die Initialisierungsmethode für diese Threads keine Ausnahmen ausgelöst hat.That value is returned to any other threads that were simultaneously running the initialization method, unless the initialization method throws exceptions on those threads. Alle Instanzen von T, die von den konkurrierenden Threads erstellt wurden, werden verworfen.Any instances of T that were created by the competing threads are discarded. Wenn die Initialisierungsmethode für einen Thread eine Ausnahme auslöst, wird die Ausnahme aus der Value-Eigenschaft für diesen Thread weitergegeben.If the initialization method throws an exception on any thread, the exception is propagated out of the Value property on that thread. Die Ausnahme wird nicht zwischengespeichert.The exception is not cached. Der Wert der IsValueCreated-Eigenschaft bleibt false und nachfolgende Aufrufe der Value-Eigenschaft führen zur erneuten Ausführung der Initialisierungsmethode, entweder durch den Thread, bei dem die Ausnahme ausgelöst wurde oder durch andere Threads.The value of the IsValueCreated property remains false, and subsequent calls to the Value property, either by the thread where the exception was thrown or by other threads, cause the initialization method to run again. Wenn die Initialisierungsmethode rekursiv auf die Value-Eigenschaft der Lazy<T>-Instanz zugreift, wird keine Ausnahme ausgelöst.If the initialization method recursively accesses the Value property of the Lazy<T> instance, no exception is thrown.

Hinweise

Verwenden Sie diese Enumeration, um mode den Parameter Lazy<T> von Konstruktoren anzugeben.Use this enumeration to specify the mode parameter of Lazy<T> constructors. Die Auswirkungen aller Konstruktoren auf die Thread Synchronisierung können im Hinblick auf diese Enumeration beschrieben werden, unabhängig davon, ob mode Sie über Parameter verfügen.The effects of all constructors on thread synchronization can be described in terms of this enumeration, whether or not they have mode parameters.

Eine Lazy<T> -Instanz wird entweder durch eine benutzerdefinierte Initialisierungs Methode oder durch den Parameter losen Konstruktor für Tinitialisiert.A Lazy<T> instance is initialized either by a user-specified initialization method or by the parameterless constructor for T. Die Initialisierungs Methode wird durch den valueFactory -Parameter Lazy<T> eines Konstruktors angegeben.The initialization method is specified by the valueFactory parameter of a Lazy<T> constructor. Die-Methode gibt eine Instanz Tvon zurück, bei der es sich um den Typ handelt, der von der Instanz Lazy<T>von verzögert instanziiert wird.The method returns an instance of T, which is the type that is lazily instantiated by the instance of Lazy<T>. Wenn ein Konstruktor keinen valueFactory -Parameter hat, wird der Parameter lose Konstruktor für T verwendet, um die Lazy<T> Instanz zu initialisieren.If a constructor does not have a valueFactory parameter, the parameterless constructor for T is used to initialize the Lazy<T> instance. In beiden Fällen erfolgt die Initialisierung, wenn Sie die Lazy<T>.Value -Eigenschaft zum ersten Mal aufzurufen.In either case, initialization occurs the first time you call the Lazy<T>.Value property.

Zusätzlich zur Angabe der Thread Sicherheit einer Lazy<T> -Instanz wirkt sich diese Enumeration auf das Zwischenspeichern von Ausnahmen aus.In addition to specifying the thread safety of a Lazy<T> instance, this enumeration affects exception caching. Wenn Ausnahmen für eine Lazy<T> -Instanz zwischengespeichert werden, erhalten Sie nur eine Chance, die Instanz zu initialisieren.When exceptions are cached for a Lazy<T> instance, you get only one chance to initialize the instance. Wenn eine Ausnahme ausgelöst wird, wenn Sie die Lazy<T>.Value -Eigenschaft zum ersten Mal aufrufen, wird diese Ausnahme zwischengespeichert und bei allen nachfolgenden Aufrufen der Lazy<T>.Value -Eigenschaft erneut ausgelöst.If an exception is thrown the first time you call the Lazy<T>.Value property, that exception is cached and rethrown on all subsequent calls to the Lazy<T>.Value property. Der Vorteil der Zwischenspeicherung von Ausnahmen besteht darin, dass alle zwei Threads immer dasselbe Ergebnis erhalten, auch wenn Fehler auftreten.The advantage of caching exceptions is that any two threads always get the same result, even when errors occur.

Wenn Sie den publicationonly-Modus angeben, werden Ausnahmen nie zwischengespeichert.When you specify the PublicationOnly mode, exceptions are never cached. Wenn Sie keine oder executionandpublication angeben, hängt das Caching davon ab, ob Sie eine Initialisierungs Methode angeben oder zulassen, dass T der Parameter lose Konstruktor verwendet wird.When you specify None or ExecutionAndPublication, caching depends on whether you specify an initialization method or allow the parameterless constructor for T to be used. Durch die Angabe einer Initialisierungsmethode wird das Zwischenspeichern von Ausnahmen für diese beiden Modi aktiviert.Specifying an initialization method enables exception caching for these two modes. Die Initialisierungsmethode kann sehr einfach sein.The initialization method can be very simple. Beispielsweise könnte Sie den Parameter Tlosen Konstruktor für: new Lazy<Contents>(() => new Contents(), mode) in C#oder New Lazy(Of Contents)(Function() New Contents()) in Visual Basic aufzurufen.For example, it might call the parameterless constructor for T: new Lazy<Contents>(() => new Contents(), mode) in C#, or New Lazy(Of Contents)(Function() New Contents()) in Visual Basic. Wenn Sie einen Konstruktor verwenden, der keine Initialisierungs Methode angibt, werden Ausnahmen, die vom Parameter losen Konstruktor für T ausgelöst werden, nicht zwischengespeichert.If you use a constructor that does not specify an initialization method, exceptions that are thrown by the parameterless constructor for T are not cached. In der folgenden Tabelle wird das Verhalten beim Zwischenspeichern von AusnahmenThe following table summarizes exception caching behavior.

ModusMode Verwenden der Initialisierungs MethodeUsing initialization method Verwenden eines Parameter losen Konstruktors fürTUsing parameterless constructor for T
KeineNone ZwischengespeichertCached Nicht zwischengespeichertNot cached
PublicationOnlyPublicationOnly Nicht zwischengespeichertNot cached Nicht zwischengespeichertNot cached
ExecutionAndPublicationExecutionAndPublication ZwischengespeichertCached Nicht zwischengespeichertNot cached

Gilt für:

Siehe auch