Thread.GetData(LocalDataStoreSlot) Methode

Definitie

Haalt de waarde op uit de opgegeven site op de huidige thread, binnen het huidige domein van de huidige thread. Voor betere prestaties gebruikt u in plaats daarvan velden die zijn gemarkeerd met het ThreadStaticAttribute kenmerk.

public:
 static System::Object ^ GetData(LocalDataStoreSlot ^ slot);
public static object GetData(LocalDataStoreSlot slot);
static member GetData : LocalDataStoreSlot -> obj
Public Shared Function GetData (slot As LocalDataStoreSlot) As Object

Parameters

slot
LocalDataStoreSlot

De LocalDataStoreSlot waarde waaruit de waarde moet worden opgehaald.

Retouren

De opgehaalde waarde.

Voorbeelden

Deze sectie bevat twee codevoorbeelden. In het eerste voorbeeld ziet u hoe u een veld gebruikt dat is gemarkeerd met het ThreadStaticAttribute kenmerk voor het opslaan van threadspecifieke informatie. In het tweede voorbeeld ziet u hoe u een gegevenssite gebruikt om hetzelfde te doen.

Eerste voorbeeld

In het volgende voorbeeld ziet u hoe u een veld gebruikt dat is gemarkeerd voor ThreadStaticAttribute het opslaan van threadspecifieke informatie. Deze techniek biedt betere prestaties dan de techniek die in het tweede voorbeeld wordt weergegeven.

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        for(int i = 0; i < 3; i++)
        {
            Thread newThread = new Thread(ThreadData.ThreadStaticDemo);
            newThread.Start();
        }
    }
}

class ThreadData
{
    [ThreadStatic]
    static int threadSpecificData;

    public static void ThreadStaticDemo()
    {
        // Store the managed thread id for each thread in the static
        // variable.
        threadSpecificData = Thread.CurrentThread.ManagedThreadId;
      
        // Allow other threads time to execute the same code, to show
        // that the static data is unique to each thread.
        Thread.Sleep( 1000 );

        // Display the static data.
        Console.WriteLine( "Data for managed thread {0}: {1}", 
            Thread.CurrentThread.ManagedThreadId, threadSpecificData );
    }
}

/* This code example produces output similar to the following:

Data for managed thread 4: 4
Data for managed thread 5: 5
Data for managed thread 3: 3
 */
open System
open System.Threading

type ThreadData() =
    // Create a static variable to hold the data for each thread.
    [<ThreadStatic; DefaultValue>]
    static val mutable private threadSpecificData : int

    static member ThreadStaticDemo() =
        // Store the managed thread id for each thread in the static
        // variable.
        ThreadData.threadSpecificData <- Thread.CurrentThread.ManagedThreadId
        
        // Allow other threads time to execute the same code, to show
        // that the static data is unique to each thread.
        Thread.Sleep 1000

        // Display the static data.
        printfn $"Data for managed thread {Thread.CurrentThread.ManagedThreadId}: {ThreadData.threadSpecificData}" 

for i = 0 to 2 do 
    let newThread = Thread ThreadData.ThreadStaticDemo
    newThread.Start()

// This code example produces output similar to the following:
//       Data for managed thread 4: 4
//       Data for managed thread 5: 5
//       Data for managed thread 3: 3
Imports System.Threading

Class Test

    <MTAThread> _
    Shared Sub Main()

        For i As Integer = 1 To 3
            Dim newThread As New Thread(AddressOf ThreadData.ThreadStaticDemo)
            newThread.Start()
        Next i

    End Sub

End Class

Class ThreadData

    <ThreadStatic> _
    Shared threadSpecificData As Integer

    Shared Sub ThreadStaticDemo()

        ' Store the managed thread id for each thread in the static
        ' variable.
        threadSpecificData = Thread.CurrentThread.ManagedThreadId
      
        ' Allow other threads time to execute the same code, to show
        ' that the static data is unique to each thread.
        Thread.Sleep( 1000 )

        ' Display the static data.
        Console.WriteLine( "Data for managed thread {0}: {1}", _
            Thread.CurrentThread.ManagedThreadId, threadSpecificData )

    End Sub

End Class

' This code example produces output similar to the following:
'
'Data for managed thread 4: 4
'Data for managed thread 5: 5
'Data for managed thread 3: 3

Tweede voorbeeld

In het volgende voorbeeld ziet u hoe u een gegevenssite gebruikt om threadspecifieke informatie op te slaan.

using System;
using System.Threading;

class Test
{
    static void Main()
    {
        Thread[] newThreads = new Thread[4];
        for(int i = 0; i < newThreads.Length; i++)
        {
            newThreads[i] = new Thread(
                new ThreadStart(Slot.SlotTest));
            newThreads[i].Start();
        }
    }
}

class Slot
{
    static Random randomGenerator;
    static LocalDataStoreSlot localSlot;

    static Slot()
    {
        randomGenerator = new Random();
        localSlot = Thread.AllocateDataSlot();
    }

    public static void SlotTest()
    {
        // Set different data in each thread's data slot.
        Thread.SetData(localSlot, randomGenerator.Next(1, 200));

        // Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", 
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(localSlot).ToString());

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to the thread.
        Thread.Sleep(1000);

        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", 
            AppDomain.GetCurrentThreadId().ToString(),
            Thread.GetData(localSlot).ToString());
    }
}
open System
open System.Threading

module Slot =
    let randomGenerator = Random()
    let localSlot = Thread.AllocateDataSlot()


    let slotTest () =
        // Set different data in each thread's data slot.
        Thread.SetData(localSlot, randomGenerator.Next(1, 200))

        // Write the data from each thread's data slot.
        printfn $"Data in thread_{AppDomain.GetCurrentThreadId()}'s data slot: {Thread.GetData localSlot, 3}"

        // Allow other threads time to execute SetData to show
        // that a thread's data slot is unique to the thread.
        Thread.Sleep 1000

        printfn $"Data in thread_{AppDomain.GetCurrentThreadId()}'s data slot: {Thread.GetData localSlot, 3}"

let newThreads =
    [| for _ = 0 to 3 do
           let thread = Thread Slot.slotTest
           thread.Start()
           thread |]
Imports System.Threading

Class Test

    <MTAThread> _
    Shared Sub Main()
        Dim newThreads(3) As Thread
        For i As Integer = 0 To newThreads.Length - 1
            newThreads(i) = New Thread(AddressOf Slot.SlotTest)
            newThreads(i).Start()
        Next i
    End Sub

End Class

Public Class Slot

    Shared randomGenerator As Random
    Shared localSlot As LocalDataStoreSlot

    Shared Sub New()
        randomGenerator = new Random()
        localSlot = Thread.AllocateDataSlot()
    End Sub

    Shared Sub SlotTest()

        ' Set different data in each thread's data slot.
        Thread.SetData(localSlot, randomGenerator.Next(1, 200))

        ' Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", _
            AppDomain.GetCurrentThreadId().ToString(), _
            Thread.GetData(localSlot).ToString())

        ' Allow other threads time to execute SetData to show
        ' that a thread's data slot is unique to the thread.
        Thread.Sleep(1000)

        ' Write the data from each thread's data slot.
        Console.WriteLine("Data in thread_{0}'s data slot: {1,3}", _
            AppDomain.GetCurrentThreadId().ToString(), _
            Thread.GetData(localSlot).ToString())
    End Sub

End Class

Opmerkingen

Important

.NET Framework biedt twee mechanismen voor het gebruik van lokale threadopslag (TLS): thread-relatieve statische velden (dat wil gezegd: velden die zijn gemarkeerd met het kenmerk ThreadStaticAttribute) en gegevenssites. Thread-relatieve statische velden bieden veel betere prestaties dan gegevenssites en maken het controleren van het type compileertijd mogelijk. Zie De lokale opslag van threads Thread-Relative statische velden en gegevenssites voor meer informatie over het gebruik van TLS.

Threads gebruiken een geheugenmechanisme voor lokaal archief om threadspecifieke gegevens op te slaan. De algemene taalruntime wijst een matrix met meerdere sleufgegevensarchieven toe aan elk proces wanneer deze wordt gemaakt. De thread kan een gegevenssite in het gegevensarchief toewijzen, een gegevenswaarde opslaan en ophalen in de site en de sleuf vrijmaken voor hergebruik nadat de thread is verlopen. Gegevenssites zijn uniek per thread. Geen andere thread (zelfs geen onderliggende thread) kan die gegevens ophalen.

Note

GetData is een Shared methode die altijd van toepassing is op de momenteel uitgevoerde thread, zelfs als u deze aanroept met behulp van een variabele die verwijst naar een andere thread. Gebruik de klassenaam bij het aanroepen van Shared methoden om verwarring te voorkomen: Dim test As Object = Thread.GetData(testSlot)

Van toepassing op

Zie ook