LazyThreadSafetyMode Enum

Definitie

Hiermee geeft u op hoe een Lazy<T> exemplaar de toegang tussen meerdere threads synchroniseert.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Overname
LazyThreadSafetyMode

Velden

Name Waarde Description
None 0

Het Lazy<T> exemplaar is niet threadveilig. Als het exemplaar wordt geopend vanuit meerdere threads, is het gedrag ervan niet gedefinieerd. Gebruik deze modus alleen als hoge prestaties cruciaal zijn en het Lazy<T> exemplaar wordt gegarandeerd nooit geïnitialiseerd vanuit meer dan één thread. Als u een Lazy<T> constructor gebruikt waarmee een initialisatiemethode (valueFactory parameter) wordt opgegeven en als die initialisatiemethode een uitzondering genereert (of een uitzondering niet kan verwerken) wanneer u de eigenschap voor het Value eerst aanroept, wordt de uitzondering in de cache opgeslagen en opnieuw gegenereerd bij volgende aanroepen naar de Value eigenschap. Als u een Lazy<T> constructor gebruikt die geen initialisatiemethode opgeeft, worden uitzonderingen die door de parameterloze constructor T worden gegenereerd, niet in de cache opgeslagen. In dat geval kan een volgende aanroep van de Value eigenschap het Lazy<T> exemplaar initialiseren. Als de initialisatiemethode recursief toegang heeft tot de Value eigenschap van het Lazy<T> exemplaar, wordt er een InvalidOperationException gegenereerd.

PublicationOnly 1

Wanneer meerdere threads tegelijkertijd een Lazy<T> exemplaar proberen te initialiseren, mogen alle threads de initialisatiemethode uitvoeren (of de constructor zonder parameters, als er geen initialisatiemethode is). Met de eerste thread voor het voltooien van de initialisatie wordt de waarde van het Lazy<T> exemplaar ingesteld. Dit wordt genoemd Publication in de veldnamen. Deze waarde wordt geretourneerd naar andere threads die tegelijkertijd de initialisatiemethode hebben uitgevoerd, tenzij de initialisatiemethode uitzonderingen op deze threads genereert. Alle exemplaren die T zijn gemaakt door de concurrerende threads, worden verwijderd. In feite is de publicatie van de geïnitialiseerde waarde thread-veilig in de zin dat slechts één van de geïnitialiseerde waarden kan worden gepubliceerd en gebruikt door alle threads. Als de initialisatiemethode een uitzondering genereert voor een thread, wordt de uitzondering buiten de Value eigenschap van die thread doorgegeven. De uitzondering wordt niet in de cache opgeslagen. De waarde van de IsValueCreated eigenschap blijft falsebehouden en de volgende aanroepen naar de Value eigenschap, ofwel door de thread waarin de uitzondering is opgetreden of door andere threads, zorgen ervoor dat de initialisatiemethode opnieuw wordt uitgevoerd. Als de initialisatiemethode recursief toegang heeft tot de Value eigenschap van het Lazy<T> exemplaar, wordt er geen uitzondering gegenereerd.

ExecutionAndPublication 2

Vergrendelingen worden gebruikt om ervoor te zorgen dat slechts één thread een Lazy<T> exemplaar op een threadveilige manier kan initialiseren. In feite wordt de initialisatiemethode uitgevoerd op een threadveilige manier (aangeduid als Execution in de veldnaam). Publication van de geïnitialiseerde waarde is ook thread-veilig in de zin dat slechts één waarde kan worden gepubliceerd en gebruikt door alle threads. Als de initialisatiemethode (of de parameterloze constructor, als er geen initialisatiemethode is) intern vergrendelingen gebruikt, kunnen impasses optreden. Als u een Lazy<T> constructor gebruikt waarmee een initialisatiemethode (valueFactory parameter) wordt opgegeven en als die initialisatiemethode een uitzondering genereert (of een uitzondering niet kan verwerken) wanneer u de eigenschap voor het Value eerst aanroept, wordt de uitzondering in de cache opgeslagen en opnieuw gegenereerd bij volgende aanroepen naar de Value eigenschap. Als u een Lazy<T> constructor gebruikt die geen initialisatiemethode opgeeft, worden uitzonderingen die door de parameterloze constructor T worden gegenereerd, niet in de cache opgeslagen. In dat geval kan een volgende aanroep van de Value eigenschap het Lazy<T> exemplaar initialiseren. Als de initialisatiemethode recursief toegang heeft tot de Value eigenschap van het Lazy<T> exemplaar, wordt er een InvalidOperationException gegenereerd.

Opmerkingen

Gebruik deze opsomming om de mode parameter van Lazy<T> constructors op te geven. De effecten van alle constructors op threadsynchronisatie kunnen worden beschreven in termen van deze opsomming, ongeacht of ze parameters hebben mode .

Een Lazy<T> exemplaar wordt geïnitialiseerd door een door de gebruiker opgegeven initialisatiemethode of door de parameterloze constructor voor T. De initialisatiemethode wordt opgegeven door de valueFactory parameter van een Lazy<T> constructor. De methode retourneert een instantie van T, het type dat lazily wordt geïnstantieerd door het exemplaar van Lazy<T>. Als een constructor geen parameter heeft valueFactory , wordt de parameterloze constructor gebruikt T om het Lazy<T> exemplaar te initialiseren. In beide gevallen vindt initialisatie plaats de eerste keer dat u de Lazy<T>.Value eigenschap aanroept.

Naast het opgeven van de threadveiligheid van een Lazy<T> exemplaar, is deze opsomming van invloed op het opslaan van uitzonderingen. Wanneer uitzonderingen voor een Lazy<T> exemplaar in de cache worden opgeslagen, krijgt u slechts één kans om het exemplaar te initialiseren. Als er een uitzondering wordt gegenereerd wanneer u de eigenschap voor het eerst aanroept, wordt deze uitzondering in de Lazy<T>.Value cache opgeslagen en opnieuw gegooid bij alle volgende aanroepen naar de Lazy<T>.Value eigenschap. Het voordeel van cachinguitzonderingen is dat twee threads altijd hetzelfde resultaat krijgen, zelfs wanneer er fouten optreden.

Wanneer u de publicatiemodus Oply opgeeft, worden uitzonderingen nooit in de cache opgeslagen. Wanneer u Geen of ExecutionAndPublication opgeeft, is caching afhankelijk van of u een initialisatiemethode opgeeft of de parameterloze constructor toestaat die T moet worden gebruikt. Als u een initialisatiemethode opgeeft, kunt u uitzonderingen in de cache opslaan voor deze twee modi. De initialisatiemethode kan heel eenvoudig zijn. Het kan bijvoorbeeld de parameterloze constructor aanroepen voor T: new Lazy<Contents>(() => new Contents(), mode) in C# of New Lazy(Of Contents)(Function() New Contents()) in Visual Basic. Als u een constructor gebruikt die geen initialisatiemethode opgeeft, worden uitzonderingen die door de parameterloze constructor T worden gegenereerd, niet in de cache opgeslagen. De volgende tabel bevat een overzicht van het cachegedrag van uitzonderingen.

Mode Initialisatiemethode gebruiken Parameterloze constructor gebruiken voor T
Geen Cache Niet in cache opgeslagen
PublicatieOnly Niet in cache opgeslagen Niet in cache opgeslagen
ExecutionAndPublication Cache Niet in cache opgeslagen

Van toepassing op

Zie ook