Trad Lokal Lagring: Tradrelaterte Statiske Felt og Data Slots.

Trad Lokal Lagring: Tradrelaterte Statiske Felt og Data Slots.

I denne artikkelen.

Du kan bruke administrert trad lokal lagring (TLS) til a lagre data som er unike for et trad- og applikasjonsdomene. .NET Framework gir to mater a bruke administrerte TLS: tradrelaterte statiske felt og datautvalg.

Bruk tradrelaterte statiske felt (tradrelaterte delte felt i Visual Basic) hvis du kan forutse dine noyaktige behov pa kompileringstidspunktet. Tradrelaterte statiske felt gir best ytelse. De gir deg ogsa fordelene med kompileringstidstjekking.

Bruk data slots nar dine faktiske krav kan oppdages bare ved kjoretid. Dataspor er tregere og mer vanskelig a bruke enn tradrelaterte statiske felt, og data lagres som type Objekt, sa du ma kaste den til riktig type for du bruker den.

I ustyrt C ++ bruker du TlsAlloc til a allokere slots dynamisk og __declspec (trad) for a erkl re at en variabel skal tildeles i tradrelativ lagring. Tradrelaterte statiske felt og datautvalg gir den administrerte versjonen av denne oppforselen.

I .NET Framework 4 kan du bruke System.Threading.ThreadLocal & lt; T & gt; klassen for a lage trad-lokale objekter som initialiseres lurt nar objektet blir konsumert forst. For mer informasjon, se Lazy Initialization.

Unikhet av data i administrerte TLS.

Enten du bruker tradrelaterte statiske felt eller dataspor, er data i administrerte TLS unike for kombinasjonen av trad og applikasjonsdomene.

Innenfor et programdomen kan en trad ikke endre data fra en annen trad, selv om begge tradene bruker samme felt eller spor.

Nar en trad apner det samme feltet eller sporet fra flere applikasjonsdomener, opprettholdes en egen verdi i hvert applikasjonsdomene.

Hvis en trad for eksempel angir verdien av et tradrelatert statisk felt, gar inn i et annet applikasjonsdomene, og henter deretter verdien av feltet, differensieres verdien i det andre programdomenet fra verdien i det forste programdomenet. Angi en ny verdi for feltet i det andre programdomenet pavirker ikke feltets verdi i det forste programdomenet.

Pa samme mate, nar en trad far det samme navngitte datautvalget i to forskjellige applikasjonsdomener, forblir dataene i det forste programdomenet uavhengig av dataene i det andre programdomenet.

Tradrelaterte statiske felt.

Hvis du vet at et stykke data alltid er unikt for en trad- og applikasjonsdomenekombinasjon, bruk ThreadStaticAttribute attributtet til det statiske feltet. Bruk feltet som du vil bruke noe annet statisk felt. Dataene i feltet er unike for hver trad som bruker den.

Tradrelaterte statiske felt gir bedre ytelse enn dataspor og har fordelen av samlingstids typekontroll.

V r oppmerksom pa at noen klassekonstruktorkode vil lope pa den forste traden i den forste konteksten som kommer til feltet. I alle andre trader eller sammenhenger i det samme programdomenet vil feltene initialiseres til null (ingenting i Visual Basic) hvis de er referansetyper, eller til standardverdiene dersom de er verdiktyper. Derfor bor du ikke stole pa klassekonstruksjoner for a initialisere tradrelaterte statiske felt. I stedet unnga a initialisere tradrelaterte statiske felt og antar at de initialiseres til null (ingenting) eller til standardverdiene.

Data Slots.

.NET Framework gir dynamiske datautvalg som er unike for en kombinasjon av trad og applikasjons-domene. Det finnes to typer datautspor: navngitte slots og unnamed slots. Begge er implementert ved hjelp av LocalDataStoreSlot-strukturen.

For a opprette et navngitt dataport, bruk Thread.AllocateNamedDataSlot eller Thread.GetNamedDataSlot-metoden. For a fa en referanse til et eksisterende navngitt spor, send navnet sitt til GetNamedDataSlot-metoden.

Hvis du vil opprette et navngitt dataspor, bruker du Thread.AllocateDataSlot-metoden.

For bade navngitte og ikke navngitte spor, bruk Thread.SetData og Thread.GetData metoder for a sette og hente informasjonen i sporet. Dette er statiske metoder som alltid virker pa dataene for traden som for tiden utforer dem.

Navngitte spor kan v re praktisk, fordi du kan hente sporet nar du trenger det, ved a gi navnet sitt til GetNamedDataSlot-metoden, i stedet for a opprettholde en referanse til et navngitt spor. Men hvis en annen komponent bruker samme navn for sin tradrelaterte lagring og en trad utforer kode fra bade komponenten din og den andre komponenten, kan de to komponentene korrumper hverandres data. (Dette scenariet forutsetter at begge komponentene kjorer i samme applikasjonsdomene, og at de ikke er utformet for a dele de samme dataene.)