Auf Englisch lesen

Freigeben über


Thread.AllocateNamedDataSlot(String) Methode

Definition

Reserviert einen benannten Datenslot für alle Threads. Eine höhere Leistung erzielen Sie, wenn Sie stattdessen Felder verwenden, die mit dem ThreadStaticAttribute-Attribut markiert sind.

C#
public static LocalDataStoreSlot AllocateNamedDataSlot(string name);

Parameter

name
String

Der Name des zu reservierenden Datenslots.

Gibt zurück

Der reservierte benannte Datenslot für alle Threads.

Ausnahmen

Es ist bereits ein benannter Datenslot mit dem angegebenen Namen vorhanden.

Beispiele

Dieser Abschnitt enthält zwei Codebeispiele. Im ersten Beispiel wird gezeigt, wie ein Feld verwendet wird, das mit dem ThreadStaticAttribute -Attribut markiert ist, um threadspezifische Informationen zu enthalten. 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 ThreadStaticAttribute gekennzeichnet ist, 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 benannter Datenslot zum Speichern threadspezifischer Informationen verwendet wird.

Hinweis

Der Beispielcode verwendet die AllocateNamedDataSlot -Methode nicht, da die GetNamedDataSlot -Methode den Slot zuordnet, wenn er noch nicht zugeordnet wurde. Wenn die AllocateNamedDataSlot -Methode verwendet wird, sollte sie beim Programmstart im Hauptthread aufgerufen werden.

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 (TLS): threadrelative statische Felder (d. h. Felder, die mit dem ThreadStaticAttribute Attribut markiert sind) und Datenslots. Threadrelative statische Felder bieten eine viel bessere Leistung als Datenslots und ermöglichen die Überprüfung des Kompilierzeittyps. Weitere Informationen zur Verwendung von TLS finden Sie unter Thread Local Storage: Thread-Relative Statische Felder und Datenslots.

Threads verwenden einen lokalen Speicherspeichermechanismus, um threadspezifische Daten zu speichern. Die Common Language Runtime weist jedem Prozess bei der Erstellung ein Array mit einem Datenspeicher mit mehreren Slots zu. Der Thread kann einen Datenslot im Datenspeicher zuordnen, einen Datenwert im Slot speichern und abrufen und den Slot nach Ablauf des Threads zur Wiederverwendung freigeben. Datenslots sind pro Thread eindeutig. Kein anderer Thread (nicht einmal ein untergeordneter Thread) kann diese Daten abrufen.

Es ist nicht erforderlich, die AllocateNamedDataSlot -Methode zum Zuordnen eines benannten Datenslots zu verwenden, da die GetNamedDataSlot Methode den Slot zuordnet, wenn er noch nicht zugeordnet wurde.

Hinweis

Wenn die AllocateNamedDataSlot -Methode verwendet wird, sollte sie im Hauptthread beim Programmstart aufgerufen werden, da sie eine Ausnahme auslöst, wenn bereits ein Slot mit dem angegebenen Namen zugeordnet wurde. Es gibt keine Möglichkeit zu testen, ob bereits ein Slot zugewiesen wurde.

Mit dieser Methode zugeordnete Slots müssen mit FreeNamedDataSlotfreigegeben 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, 8, 9, 10
.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, 4.8.1
.NET Standard 2.0, 2.1

Weitere Informationen