LazyThreadSafetyMode Enumeration
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Gibt an, wie eine Lazy<T>-Instanz den Zugriff bei mehreren Threads synchronisiert.
public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode =
Public Enum LazyThreadSafetyMode
- Vererbung
Felder
ExecutionAndPublication | 2 | Sperren werden dazu verwendet, um sicherzustellen, dass eine Lazy<T>-Instanz nur von einem einzelner Thread auf threadsichere Weise initialisiert werden kann. Die Initialisierungsmethode wird effektiv in threadsicherer Weise ausgeführt (als Feldname bezeichnet |
None | 0 | Die Lazy<T>-Instanz ist nicht threadsicher. Wenn mehrere Threads auf die Instanz zugreifen, ist das Verhalten nicht definiert. 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. Wenn Sie einen Lazy<T>-Konstruktor verwenden, der eine Initialisierungsmethode angibt ( |
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. Der erste Thread, der die Initialisierung abgeschlossen hat, legt den Wert der Lazy<T>-Instanz fest. Dies wird in |
Hinweise
Verwenden Sie diese Enumeration, um den mode
Parameter von Lazy<T> Konstruktoren anzugeben. Die Auswirkungen aller Konstruktoren auf die Threadsynchronisierung können in Bezug auf diese Enumeration beschrieben werden, unabhängig davon, ob sie Parameter haben mode
.
Eine Lazy<T> Instanz wird entweder durch eine vom Benutzer angegebene Initialisierungsmethode oder durch den parameterlosen Konstruktor für T
. Die Initialisierungsmethode wird vom valueFactory
Parameter eines Lazy<T> Konstruktors angegeben. Die Methode gibt eine Instanz von T
, die der Typ ist, der durch die Instanz von Lazy<T>. Wenn ein Konstruktor keinen Parameter hat valueFactory
, wird der parameterlose Konstruktor T
verwendet, um die Lazy<T> Instanz zu initialisieren. In beiden Fällen tritt die Initialisierung beim ersten Aufruf der Lazy<T>.Value Eigenschaft auf.
Zusätzlich zur Angabe der Threadsicherheit einer Lazy<T> Instanz wirkt sich diese Enumeration auf die Zwischenspeicherung von Ausnahmen aus. Wenn Ausnahmen für eine Lazy<T> Instanz zwischengespeichert werden, erhalten Sie nur eine Chance, die Instanz zu initialisieren. 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 ausgeführt. Der Vorteil von Zwischenspeichern von Ausnahmen besteht darin, dass alle zwei Threads immer dasselbe Ergebnis erhalten, auch wenn Fehler auftreten.
Wenn Sie den PublicationOnly-Modus angeben, werden Ausnahmen nie zwischengespeichert. Wenn Sie "None" oder "ExecutionAndPublication" angeben, hängt die Zwischenspeicherung davon ab, ob Sie eine Initialisierungsmethode angeben oder den parameterlosen Konstruktor für T
die Verwendung zulassen. Durch die Angabe einer Initialisierungsmethode wird das Zwischenspeichern von Ausnahmen für diese beiden Modi aktiviert. Die Initialisierungsmethode kann sehr einfach sein. Beispielsweise kann er den parameterlosen Konstruktor für T
: new Lazy<Contents>(() => new Contents(), mode)
in C# oder New Lazy(Of Contents)(Function() New Contents())
in Visual Basic aufrufen. Wenn Sie einen Konstruktor verwenden, der keine Initialisierungsmethode angibt, werden Ausnahmen, die vom parameterlosen Konstruktor T
ausgelöst werden, nicht zwischengespeichert. In der folgenden Tabelle wird das Zwischenspeicherverhalten von Ausnahmen zusammengefasst.
Modus | Verwenden der Initialisierungsmethode | Verwenden eines parameterlosen Konstruktors für T |
---|---|---|
Keine | Zwischengespeichert | Nicht zwischengespeichert |
PublikationOnly | Nicht zwischengespeichert | Nicht zwischengespeichert |
ExecutionAndPublication | Zwischengespeichert | Nicht zwischengespeichert |