LazyThreadSafetyMode Enum

Definition

Anger hur en Lazy<T> instans synkroniserar åtkomst mellan flera trådar.

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

Fält

Name Värde Description
None 0

Instansen Lazy<T> är inte trådsäker. Om instansen nås från flera trådar är dess beteende odefinierat. Använd endast det här läget när höga prestanda är avgörande och instansen Lazy<T> garanterat aldrig initieras från mer än en tråd. Om du använder en Lazy<T> konstruktor som anger en initieringsmetod (valueFactory parameter), och om den initieringsmetoden utlöser ett undantag (eller inte hanterar ett undantag) första gången du anropar Value egenskapen, cachelagras undantaget igen vid efterföljande anrop till Value egenskapen. Om du använder en Lazy<T> konstruktor som inte anger någon initieringsmetod cachelagras inte undantag som genereras av den parameterlösa konstruktorn för T . I så fall kan ett efterföljande anrop till Value egenskapen initiera instansen Lazy<T> . Om initieringsmetoden rekursivt kommer åt Value egenskapen för instansen Lazy<T> genereras en InvalidOperationException .

PublicationOnly 1

När flera trådar försöker initiera en Lazy<T> instans samtidigt tillåts alla trådar att köra initieringsmetoden (eller den parameterlösa konstruktorn om det inte finns någon initieringsmetod). Den första tråden för att slutföra initieringen anger värdet för instansen Lazy<T> . Detta kallas i Publication fältnamnen. Det värdet returneras till andra trådar som körde initieringsmetoden samtidigt, såvida inte initieringsmetoden utlöser undantag på dessa trådar. Alla instanser av T som har skapats av de konkurrerande trådarna ignoreras. I praktiken är publiceringen av det initierade värdet trådsäker i den meningen att endast ett av de initierade värdena kan publiceras och användas av alla trådar. Om initieringsmetoden utlöser ett undantag på en tråd sprids undantaget från egenskapen i tråden Value . Undantaget cachelagras inte. Värdet för IsValueCreated egenskapen förblir false, och efterföljande anrop till Value egenskapen, antingen av tråden där undantaget utlöstes eller av andra trådar, gör att initieringsmetoden körs igen. Om initieringsmetoden rekursivt kommer åt instansens ValueLazy<T> egenskap genereras inget undantag.

ExecutionAndPublication 2

Lås används för att säkerställa att endast en enda tråd kan initiera en Lazy<T> instans på ett trådsäkert sätt. I praktiken körs initieringsmetoden på ett trådsäkert sätt (kallas Execution i fältnamnet). Publication av det initierade värdet är också trådsäkert i den meningen att endast ett värde kan publiceras och användas av alla trådar. Om initieringsmetoden (eller den parameterlösa konstruktorn, om det inte finns någon initieringsmetod) använder lås internt, kan dödlägen inträffa. Om du använder en Lazy<T> konstruktor som anger en initieringsmetod (valueFactory parameter), och om den initieringsmetoden utlöser ett undantag (eller inte hanterar ett undantag) första gången du anropar Value egenskapen, cachelagras undantaget igen vid efterföljande anrop till Value egenskapen. Om du använder en Lazy<T> konstruktor som inte anger någon initieringsmetod cachelagras inte undantag som genereras av den parameterlösa konstruktorn för T . I så fall kan ett efterföljande anrop till Value egenskapen initiera instansen Lazy<T> . Om initieringsmetoden rekursivt kommer åt Value egenskapen för instansen Lazy<T> genereras en InvalidOperationException .

Kommentarer

Använd den här uppräkningen för att ange parametern modeLazy<T> för konstruktorer. Effekterna av alla konstruktorer på trådsynkronisering kan beskrivas i termer av den här uppräkningen, oavsett om de har mode parametrar eller inte.

En Lazy<T> instans initieras antingen av en användardefinerad initieringsmetod eller av den parameterlösa konstruktorn för T. Initieringsmetoden anges av parametern för valueFactory en Lazy<T> konstruktor. Metoden returnerar en instans av T, som är den typ som lättsinnigt instansieras av instansen av Lazy<T>. Om en konstruktor inte har någon valueFactory parameter används den parameterlösa konstruktorn för för T att initiera instansen Lazy<T> . I båda fallen sker initieringen första gången du anropar Lazy<T>.Value egenskapen.

Förutom att ange trådsäkerheten för en Lazy<T> instans påverkar den här uppräkningen undantagscachelagring. När undantag cachelagras för en Lazy<T> instans får du bara en chans att initiera instansen. Om ett undantag utlöses första gången du anropar Lazy<T>.Value egenskapen cachelagras undantaget och ändras vid alla efterföljande anrop till Lazy<T>.Value egenskapen. Fördelen med cachelagringsfel är att två trådar alltid får samma resultat, även när fel inträffar.

När du anger läget PublicationOnly cachelagras aldrig undantag. När du anger Ingen eller ExecutionAndPublication beror cachelagring på om du anger en initieringsmetod eller tillåter att den parameterlösa konstruktorn används T . Om du anger en initieringsmetod kan du cachelagra undantag för dessa två lägen. Initieringsmetoden kan vara mycket enkel. Den kan till exempel anropa den parameterlösa konstruktorn för T: new Lazy<Contents>(() => new Contents(), mode) i C#, eller New Lazy(Of Contents)(Function() New Contents()) i Visual Basic. Om du använder en konstruktor som inte anger någon initieringsmetod cachelagras inte undantag som genereras av den parameterlösa konstruktorn för T . I följande tabell sammanfattas beteendet för cachelagring av undantag.

Mode Använda initieringsmetod Använda parameterlös konstruktor för T
Ingen Cachelagrade Inte cachelagrad
PublikationOnly Inte cachelagrad Inte cachelagrad
ExecutionAndPublication Cachelagrade Inte cachelagrad

Gäller för

Se även