Auf Englisch lesen

Freigeben über


Thread.GetNamedDataSlot(String) Methode

Definition

Sucht einen benannten Datenslot. Eine höhere Leistung erzielen Sie, wenn Sie stattdessen Felder verwenden, die mit dem ThreadStaticAttribute-Attribut markiert sind.

C#
public static LocalDataStoreSlot GetNamedDataSlot (string name);

Parameter

name
String

Der Name des lokalen Datenslots.

Gibt zurück

LocalDataStoreSlot

Ein für diesen Thread reservierter LocalDataStoreSlot.

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

.NET Framework bietet zwei Mechanismen für die Verwendung des lokalen Threadspeichers (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 für die Wiederverwendung freigeben, nachdem der Thread abgelaufen ist. Datenslots sind pro Thread eindeutig. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten abrufen.

Wenn der benannte Slot nicht vorhanden ist, wird ein neuer Slot zugeordnet. Benannte Datenslots sind öffentlich und können von jedem bearbeitet werden.

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