LazyThreadSafetyMode Enumeráció

Definíció

Meghatározza, hogy egy Lazy<T> példány hogyan szinkronizálja a hozzáférést több szál között.

public enum class LazyThreadSafetyMode
public enum LazyThreadSafetyMode
type LazyThreadSafetyMode = 
Public Enum LazyThreadSafetyMode
Öröklődés
LazyThreadSafetyMode

Mezők

Name Érték Description
None 0

A Lazy<T> példány nem szálbiztos; ha a példány több szálból érhető el, a viselkedése nem definiált. Ezt a módot csak akkor használja, ha a nagy teljesítmény kritikus fontosságú, és a Lazy<T> példány garantáltan soha nem inicializálható több szálból. Ha inicializálási metódust (Lazy<T>paramétert) meghatározó konstruktort valueFactory használ, és ha az inicializálási módszer kivételt (vagy nem kezel kivételt) a tulajdonság első hívásakorValue, akkor a rendszer gyorsítótárazza a kivételt, és újra elindítja a Value tulajdonság későbbi hívásait. Ha olyan konstruktort Lazy<T> használ, amely nem ad meg inicializálási módszert, a paraméter nélküli konstruktor T által generált kivételek nem lesznek gyorsítótárazva. Ebben az esetben előfordulhat, hogy a tulajdonság későbbi hívása Value sikeresen inicializálja a példányt Lazy<T> . Ha az inicializálási módszer rekurzív módon hozzáfér a ValueLazy<T> példány tulajdonságához, a függvény egy InvalidOperationException hibát ad vissza.

PublicationOnly 1

Ha több szál egyszerre próbál inicializálni egy példányt Lazy<T> , minden szál futtathatja az inicializálási módszert (vagy paraméter nélküli konstruktort, ha nincs inicializálási módszer). Az inicializálás első szála beállítja a Lazy<T> példány értékét. Ezt nevezik Publication a mezőneveknek. Ez az érték vissza lesz adva az inicializálási metódust egyidejűleg futtató bármely más szálnak, kivéve, ha az inicializálási módszer kivételeket alkalmaz ezeken a szálakon. A versengő szálak által létrehozott példányokat T a rendszer elveti. Az inicializált érték közzététele gyakorlatilag szálbiztos abban az értelemben, hogy az inicializált értékek közül csak egy tehető közzé és használható az összes szál számára. Ha az inicializálási módszer kivételt okoz egy szálon, a rendszer a kivételt a szálon lévő tulajdonságból Value propagálja. A kivétel nincs gyorsítótárazva. A tulajdonság értéke IsValueCreated megmarad false, és a Value tulajdonság későbbi hívásai vagy a kivételt okozó szál vagy más szálak hatására az inicializálási módszer újra fut. Ha az inicializálási módszer rekurzív módon éri el a ValueLazy<T> példány tulajdonságát, a rendszer kivételt nem alkalmaz.

ExecutionAndPublication 2

A zárolásokkal biztosítható, hogy csak egyetlen szál inicializáljon egy Lazy<T> példányt szálbiztos módon. Az inicializálási módszer gyakorlatilag szálbiztos módon (a mezőnévben) Execution fut. Publication az inicializált érték szálbiztos abban az értelemben is, hogy az összes szál csak egy értéket tehet közzé és használhat fel. Ha az inicializálási módszer (vagy a paraméter nélküli konstruktor, ha nincs inicializálási módszer) belső zárolásokat használ, holtpontok léphetnek fel. Ha inicializálási metódust (Lazy<T>paramétert) meghatározó konstruktort valueFactory használ, és ha az inicializálási módszer kivételt (vagy nem kezel kivételt) a tulajdonság első hívásakorValue, akkor a rendszer gyorsítótárazza a kivételt, és újra elindítja a Value tulajdonság későbbi hívásait. Ha olyan konstruktort Lazy<T> használ, amely nem ad meg inicializálási módszert, a paraméter nélküli konstruktor T által generált kivételek nem lesznek gyorsítótárazva. Ebben az esetben előfordulhat, hogy a tulajdonság későbbi hívása Value sikeresen inicializálja a példányt Lazy<T> . Ha az inicializálási módszer rekurzív módon hozzáfér a ValueLazy<T> példány tulajdonságához, a függvény egy InvalidOperationException hibát ad vissza.

Megjegyzések

Ezzel az enumerálással adja meg a mode konstruktorok paraméterét Lazy<T> . Az összes konstruktor szálszinkronizálásra gyakorolt hatását e számbavétel szempontjából lehet leírni, függetlenül attól, hogy vannak-e mode paramétereik.

A Lazy<T> példányokat egy felhasználó által megadott inicializálási módszerrel vagy a paraméter nélküli konstruktor Tinicializálja. Az inicializálási módszert egy valueFactoryLazy<T> konstruktor paramétere határozza meg. A metódus egy példányt Tad vissza, amely a példány Lazy<T>által lazán példányosított típus. Ha egy konstruktor nem rendelkezik paraméterrel valueFactory , a példány inicializálásához TLazy<T> a paraméter nélküli konstruktor használható. Mindkét esetben az inicializálás a tulajdonság első hívásakor Lazy<T>.Value történik.

A példány szálbiztonságának Lazy<T> megadása mellett ez a számbavétel a kivétel gyorsítótárazására is hatással van. Ha egy Lazy<T> példány kivételei gyorsítótárazva vannak, csak egy esélyt kap a példány inicializálására. Ha a tulajdonság első hívásakor Lazy<T>.Value kivétel történik, a rendszer gyorsítótárazza és újrakezdi a kivételt a Lazy<T>.Value tulajdonság minden további hívása esetén. A gyorsítótárazási kivételek előnye, hogy minden két szál mindig ugyanazt az eredményt kapja, még akkor is, ha hibák történnek.

A PublicationOnly mód megadásakor a kivételek soha nem lesznek gyorsítótárazva. A Nincs vagy a ExecutionAndPublication megadásakor a gyorsítótárazás attól függ, hogy inicializálási módszert ad-e meg, vagy engedélyezi-e a paraméter nélküli konstruktor T használatát. Az inicializálási módszer megadása lehetővé teszi a kivételek gyorsítótárazását a két üzemmódban. Az inicializálási módszer nagyon egyszerű lehet. Például meghívhatja a paraméter nélküli konstruktort ehhez: T: new Lazy<Contents>(() => new Contents(), mode) C#-ben, vagy New Lazy(Of Contents)(Function() New Contents()) Visual Basic-ben. Ha olyan konstruktort használ, amely nem ad meg inicializálási módszert, a paraméter nélküli konstruktor T által generált kivételek nem lesznek gyorsítótárazva. Az alábbi táblázat a kivétel gyorsítótárazási viselkedését foglalja össze.

Üzemmód Inicializálási módszer használata Paraméter nélküli konstruktor használata T
None Gyorsítótárazott Nincs gyorsítótárazva
PublicationOnly Nincs gyorsítótárazva Nincs gyorsítótárazva
ExecutionAndPublication Gyorsítótárazott Nincs gyorsítótárazva

A következőre érvényes:

Lásd még