Auf Englisch lesen

Freigeben über


Thread.GetData(LocalDataStoreSlot) Methode

Definition

Ruft in der aktuellen Domäne des aktuellen Threads den Wert aus dem angegebenen Slot für den aktuellen Thread ab. Eine höhere Leistung erzielen Sie, wenn Sie stattdessen Felder verwenden, die mit dem ThreadStaticAttribute-Attribut markiert sind.

C#
public static object? GetData (LocalDataStoreSlot slot);
C#
public static object GetData (LocalDataStoreSlot slot);

Parameter

slot
LocalDataStoreSlot

Der LocalDataStoreSlot, aus dem der Wert abgerufen werden soll.

Gibt zurück

Object

Der abgerufene Wert.

Beispiele

Dieser Abschnitt enthält zwei Codebeispiele. Im ersten Beispiel wird gezeigt, wie ein mit dem -Attribut markiertes Feld verwendet wird, ThreadStaticAttribute um threadspezifische Informationen zu enthalten. Im zweiten Beispiel wird gezeigt, wie ein Datenslot verwendet wird, um dasselbe zu tun.

Erstes Beispiel

Im folgenden Beispiel wird gezeigt, wie ein mit markiertes Feld verwendet ThreadStaticAttribute wird, um threadspezifische Informationen zu enthalten. Diese Technik bietet eine bessere Leistung als die im zweiten Beispiel gezeigte Technik.

C#
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
 */

Zweites Beispiel

Im folgenden Beispiel wird veranschaulicht, wie ein Datenslot verwendet wird, um threadspezifische Informationen zu speichern.

C#
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());
    }
}

Hinweise

Wichtig

.NET Framework bietet zwei Mechanismen für die Verwendung von lokalem Threadspeicher (TLS): thread relative statische Felder (d. h. Felder, die mit dem -Attribut gekennzeichnet ThreadStaticAttribute sind) und Datenslots. Thread relative statische Felder bieten eine wesentlich bessere Leistung als Datenslots und ermöglichen die Typüberprüfung zur Kompilierzeit. Weitere Informationen zur Verwendung von TLS finden Sie unter Thread Local Storage: Thread-Relative Static Fields and Data Slots.

Threads verwenden einen lokalen Speicherspeichermechanismus, um threadspezifische Daten zu speichern. Die Common Language Runtime ordnet jedem Prozess beim Erstellen ein Datenspeicherarray mit mehreren Slots zu. Der Thread kann einen Datenslot im Datenspeicher zuordnen, einen Datenwert im Slot speichern und abrufen und den Slot für die Wiederverwendung nach Ablauf des Threads frei geben. Datenslots sind pro Thread eindeutig. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten erhalten.

Hinweis

GetData ist eine Methode, die immer für den aktuell ausgeführten Thread gilt, auch wenn Sie ihn mithilfe einer Variablen Shared aufrufen, die auf einen anderen Thread verweist. Um Verwirrung zu vermeiden, verwenden Sie den Klassennamen beim Aufrufen von Shared Methoden: Dim test As Object = Thread.GetData(testSlot) .

Gilt für

Produkt Versionen
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8
.NET Standard 2.0, 2.1

Siehe auch