Delen via


Lokale threadopslag: thread-relatieve statische velden en gegevenssleuven

U kunt de lokale opslag van beheerde threads (TLS) gebruiken om gegevens op te slaan die uniek zijn voor een thread- en toepassingsdomein. .NET biedt twee manieren om beheerde TLS te gebruiken: thread-relatieve statische velden en gegevenssites.

  • Gebruik thread-relatieve statische velden (thread-relatieve Shared velden in Visual Basic) als u kunt anticiperen op uw exacte behoeften tijdens het compileren. Statische threadvelden bieden de beste prestaties. Ze bieden u ook de voordelen van het controleren van het type compileertijd.

  • Gebruik gegevenssites wanneer uw werkelijke vereisten alleen tijdens runtime kunnen worden gedetecteerd. Gegevenssites zijn langzamer en onhandiger te gebruiken dan statische thread-relatieve velden en gegevens worden opgeslagen als type Object, dus u moet deze casten naar het juiste type voordat u deze gebruikt.

In niet-beheerde C++, gebruikt TlsAlloc u om slots dynamisch toe te wijzen en __declspec(thread) om aan te geven dat een variabele moet worden toegewezen in thread-relatieve opslag. Thread-relatieve statische velden en gegevenssites bieden de beheerde versie van dit gedrag.

U kunt de System.Threading.ThreadLocal<T> klasse gebruiken om thread-lokale objecten te maken die lazily worden geïnitialiseerd wanneer het object voor het eerst wordt gebruikt. Zie Lazy Initialisatie voor meer informatie.

Uniekheid van gegevens in beheerde TLS

Of u nu thread-relatieve statische velden of gegevenssites gebruikt, gegevens in beheerde TLS zijn uniek voor de combinatie van thread- en toepassingsdomein.

  • Binnen een toepassingsdomein kan één thread geen gegevens van een andere thread wijzigen, zelfs niet wanneer beide threads hetzelfde veld of dezelfde sleuf gebruiken.

  • Wanneer een thread hetzelfde veld of dezelfde site opent vanuit meerdere toepassingsdomeinen, wordt in elk toepassingsdomein een afzonderlijke waarde bijgehouden.

Als een thread bijvoorbeeld de waarde van een statisch threadveld instelt, een ander toepassingsdomein invoert en vervolgens de waarde van het veld ophaalt, verschilt de waarde die in het tweede toepassingsdomein is opgehaald van de waarde in het eerste toepassingsdomein. Het instellen van een nieuwe waarde voor het veld in het tweede toepassingsdomein heeft geen invloed op de waarde van het veld in het eerste toepassingsdomein.

Als een thread dezelfde benoemde gegevenssite in twee verschillende toepassingsdomeinen krijgt, blijven de gegevens in het eerste toepassingsdomein onafhankelijk van de gegevens in het tweede toepassingsdomein.

Thread-relatieve statische velden

Als u weet dat een stukje gegevens altijd uniek is voor een combinatie van threads en toepassingsdomeinen, past u het ThreadStaticAttribute kenmerk toe op het statische veld. Gebruik het veld zoals u elk ander statisch veld zou gebruiken. De gegevens in het veld zijn uniek voor elke thread die deze gebruikt.

Thread-relatieve statische velden bieden betere prestaties dan gegevenssites en hebben het voordeel van het controleren van het type compileertijd.

Houd er rekening mee dat elke klasseconstructorcode wordt uitgevoerd op de eerste thread in de eerste context die toegang heeft tot het veld. In alle andere threads of contexten in hetzelfde toepassingsdomein worden de velden geïnitialiseerd naar null (Nothing in Visual Basic) als ze verwijzingstypen zijn of hun standaardwaarden als het waardetypen zijn. Daarom moet u niet vertrouwen op klasseconstructors om thread-relatieve statische velden te initialiseren. Vermijd in plaats daarvan het initialiseren van statische thread-relatieve velden en ga ervan uit dat ze zijn geïnitialiseerd naar null (Nothing) of naar hun standaardwaarden.

Gegevenssleuven

.NET biedt dynamische gegevenssites die uniek zijn voor een combinatie van thread- en toepassingsdomein. Er zijn twee typen gegevenssites: benoemde sites en niet-benoemde sites. Beide worden geïmplementeerd met behulp van de LocalDataStoreSlot structuur.

Voor zowel benoemde als niet-benoemde sites gebruikt u de Thread.SetData en Thread.GetData methoden om de informatie in de site in te stellen en op te halen. Dit zijn statische methoden die altijd reageren op de gegevens voor de thread die deze momenteel uitvoert.

Benoemde sites kunnen handig zijn, omdat u de site kunt ophalen wanneer u deze nodig hebt door de naam door te geven aan de GetNamedDataSlot methode, in plaats van een verwijzing naar een niet-benoemde site te onderhouden. Als een ander onderdeel echter dezelfde naam gebruikt voor de thread-relatieve opslag en een thread code uitvoert van zowel uw onderdeel als het andere onderdeel, kunnen de twee onderdelen elkaars gegevens beschadigen. (In dit scenario wordt ervan uitgegaan dat beide onderdelen worden uitgevoerd in hetzelfde toepassingsdomein en dat ze niet zijn ontworpen om dezelfde gegevens te delen.)

Zie ook