Auf Englisch lesen

Freigeben über


Thread.SetData(LocalDataStoreSlot, Object) Methode

Definition

Legt die Daten im angegebenen Slot auf den derzeit ausgeführten Thread und für die aktuelle Domäne des betreffenden Threads fest. Eine höhere Leistung erzielen Sie, wenn Sie stattdessen Felder verwenden, die mit dem ThreadStaticAttribute-Attribut markiert sind.

C#
public static void SetData (LocalDataStoreSlot slot, object? data);
C#
public static void SetData (LocalDataStoreSlot slot, object data);

Parameter

slot
LocalDataStoreSlot

Der LocalDataStoreSlot, in dem der Wert festgelegt werden soll.

data
Object

Der festzulegende Wert.

Beispiele

Dieser Abschnitt enthält zwei Codebeispiele. Das erste Beispiel zeigt die Verwendung eines Felds, das mit dem -Attribut markiert ThreadStaticAttribute ist, um threadspezifische Informationen zu speichern. Das zweite Beispiel zeigt, wie sie einen Datenslot verwenden, um dasselbe zu tun.

Erstes Beispiel

Im folgenden Beispiel wird gezeigt, wie sie ein Feld verwenden, das mit markiert ThreadStaticAttribute ist, um threadspezifische Informationen zu speichern. 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 sie einen benannten Datenslot verwenden, um threadspezifische Informationen zu speichern.

C#
using System;
using System.Threading;

class Test
{
    public static void Main()
    {
        Thread[] newThreads = new Thread[4];
        int i;
        for (i = 0; i < newThreads.Length; i++)
        {
            newThreads[i] =
                new Thread(new ThreadStart(Slot.SlotTest));
            newThreads[i].Start();
        }
        Thread.Sleep(2000);
        for (i = 0; i < newThreads.Length; i++)
        {
            newThreads[i].Join();
            Console.WriteLine("Thread_{0} finished.",
                newThreads[i].ManagedThreadId);
        }
    }
}

class Slot
{
    private static Random randomGenerator = new Random();

    public static void SlotTest()
    {
        // Set random data in each thread's data slot.
        int slotData = randomGenerator.Next(1, 200);
        int threadId = Thread.CurrentThread.ManagedThreadId;

        Thread.SetData(
            Thread.GetNamedDataSlot("Random"),
            slotData);

        // Show what was saved in the thread's data slot.
        Console.WriteLine("Data stored in thread_{0}'s data slot: {1,3}",
            threadId, slotData);

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

        int newSlotData =
            (int)Thread.GetData(Thread.GetNamedDataSlot("Random"));

        if (newSlotData == slotData)
        {
            Console.WriteLine("Data in thread_{0}'s data slot is still: {1,3}",
                threadId, newSlotData);
        }
        else
        {
            Console.WriteLine("Data in thread_{0}'s data slot changed to: {1,3}",
                threadId, newSlotData);
        }
    }
}

Hinweise

Wichtig

Die .NET Framework bietet zwei Mechanismen für die Verwendung von threadlokaler Speicherung (Thread Local Storage, TLS): threadbezogene statische Felder (d. h. Felder, die mit dem -Attribut gekennzeichnet ThreadStaticAttribute sind) und Datenslots. Threadbezogene statische Felder bieten eine viel bessere Leistung als Datenslots und ermöglichen die Typüberprüfung zur Kompilierzeit. Weitere Informationen zur Verwendung von TLS finden Sie unter ThreadLokale Storage: Thread-Relative statische Felder und Datenslots.

Threads verwenden einen lokalen Speicherspeicher-Speichermechanismus, um threadspezifische Daten zu speichern. Die Common Language Runtime ordnet jedem Prozess bei der Erstellung ein Datenspeicherarray mit mehreren Slots zu. Der Thread kann einen Datenslot im Datenspeicher zuordnen, einen Datenwert im Slot speichern und abrufen und den Slot zur Wiederverwendung freigeben, nachdem die Threadprozedur beendet und das Objekt von der Thread Garbage Collection freigegeben wurde. Datenslots sind pro Thread eindeutig. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten abrufen.

Hinweis

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

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